0

例:

$ cat m1.py
a = 1
def f():
    print a

$ cat m2.py 
from m1 import f
a = 2
f()

実行時にpython m2.py印刷したいのですが、印刷されます。21

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です。これは、そこにある観察可能な非仮想の違いだと思います。

4

2 に答える 2

0

(私があなたを正しく理解していれば) - これを試してください:

#m2.py
from m1 import f
import m1
m1.a = 2
f()

ただし、これを行う必要があるという事実自体が、頭の中であらゆる種類のベルとホイッスルを吹き飛ばすことを言及しておく必要があります-これは非常に悪い設計のようです.

于 2012-09-24T19:15:36.100 に答える
0

あなたのコードはこの例よりも複雑だと思うので、クラスを使ってみることをお勧めします:

YourClass.py

class YourClass(object):
    def __init__(self, a=1):
        self.a = a

    def f(self):
        print self.a

YourOtherFile.py

from YourClass import YourClass

o = YourClass(a=2)  # Without explicitly setting `a=2`, `a` defaults to `1`
o.f()

これ以上の文脈がなければ、これ以上のアドバイスはできません。

于 2012-09-24T19:20:44.117 に答える