例:
$ cat m1.py
a = 1
def f():
print a
$ cat m2.py
from m1 import f
a = 2
f()
実行時にpython m2.py
印刷したいのですが、印刷されます。2
1
f
引数として取る必要がありますかa
、それともこれを達成するためのより良い方法はありますか? このように、DRYをコーディングして、同じ関数を別の「環境」で再利用しようとしています。インポート時にオーバーライドできるのであれば、a
内部で定義することも理にかなっています。f
私が考えた別の方法は次のとおりです。
$ cat m1.py
a = 1
def make_f(a):
def f():
print a
return f
f = make_f(a)
$ cat m2.py
from m1 import make_f
a = 2
f = make_f(a)
f()
これは必要に応じて機能しますが、もっと簡潔な方法はありますか?
編集:これまでの回答に感謝します。より現実的な例を提供することで何かを明確にすることはできないと思いますが、私がこれを求めている理由は、私の心の中で実際の引数の間に違いがあるためだと思いますf
(それが使用する両方のモジュールで同じ方法) と「環境」a
は異なるはずです。(異なるモジュールで異なる値を使用する必要があることから判断すると) 本当に区別するべきではないかもしれませんa
が、意味に基づいて区別するのは理にかなってa
います。
編集 2:別の考えを示し、おそらくクロージャを使用したいと結論付けました。その理由は、各モジュールの他の関数が をa
呼び出すときに提供する必要がないためf
です。これは、そこにある観察可能な非仮想の違いだと思います。