Python のモジュール
◆ export という概念がない
◆ 全部公開されてる
◆ python 自体に private という機能がない
◆ 全部公開されてる
◆ python 自体に private という機能がない
JavaScript だとエクスポートするものを宣言する必要があります
[a.mjs]
[main.mjs]
export してない value はみえません
python だと
[a.py]
[b.py]
全部見えています
モジュールのグローバル空間がそのまま import で作られる変数に入る感じです
モジュールが内部で import したモジュールにもアクセスできます
Python は private というコンセプトのないオープンな作りの言語みたいです
一応 private メソッドみたいなものはありますが 完全に private じゃないです
private として扱いたいものは _ から始めるなどのマナーだけはあって private 扱いのものを使うこともできるけど使うのは使う側の責任ということらしいです
JavaScript も割とそんな感じで private という考えのない言語でした
ですが 上で書いたみたいな module では export したもの以外は private になりますし private メソッドを作る記法の提案もたしかあったはずです
一応 クロージャを使うことで隠せはするものの ほとんどは隠されてなくて そのおかげでデバッグしやすいし ライブラリを使うときだと稀に private なメソッドを参照したい例外的な場合もありますし 助かっていました
その反面 要らないのまで見えてしまうせいで必要なものが探しづらいこともあります
ただ _ から始まるのでソートされてる補完候補だとそこまで困らないですし 見えることによるメリットのほうが多いと思います
無理やり private 値を変更されて整合性取れなくておかしな動きになるなんて事はありえますが それは変更する側が悪いわけですし
そう考えると python のモジュールはけっこういい感じかなって思います
[a.mjs]
const value = 10
export default {a: 1}
export const foo = 2
[main.mjs]
import * as a from "./a"
console.log(a)
[Module] { default: { a: 1 }, foo: 2 }
export してない value はみえません
python だと
[a.py]
a = 1
p = None
def x():
return 1
class C:
@staticmethod
def method():
return 2
import b
[b.py]
b_module = True
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> a.a
1
>>> a.p
>>> a.q
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'a' has no attribute 'q'
>>> a.x
<function x at 0x0000023628210048>
>>> a.C
<class 'a.C'>
>>> a.C.method
<function C.method at 0x00000236282100D0>
>>> a.b
<module 'b' from 'C:\\tmp\\python\\pg\\b.py'>
>>> a.b.b_module
True
全部見えています
モジュールのグローバル空間がそのまま import で作られる変数に入る感じです
モジュールが内部で import したモジュールにもアクセスできます
Python は private というコンセプトのないオープンな作りの言語みたいです
一応 private メソッドみたいなものはありますが 完全に private じゃないです
private として扱いたいものは _ から始めるなどのマナーだけはあって private 扱いのものを使うこともできるけど使うのは使う側の責任ということらしいです
JavaScript も割とそんな感じで private という考えのない言語でした
ですが 上で書いたみたいな module では export したもの以外は private になりますし private メソッドを作る記法の提案もたしかあったはずです
一応 クロージャを使うことで隠せはするものの ほとんどは隠されてなくて そのおかげでデバッグしやすいし ライブラリを使うときだと稀に private なメソッドを参照したい例外的な場合もありますし 助かっていました
その反面 要らないのまで見えてしまうせいで必要なものが探しづらいこともあります
ただ _ から始まるのでソートされてる補完候補だとそこまで困らないですし 見えることによるメリットのほうが多いと思います
無理やり private 値を変更されて整合性取れなくておかしな動きになるなんて事はありえますが それは変更する側が悪いわけですし
そう考えると python のモジュールはけっこういい感じかなって思います