0

例子:

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

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

我想在运行它时python m2.py打印2,但它会打印1.

我是否必须fa其作为论点,还是有更好的方法来实现这一点?我正在尝试对 DRY 进行编码并以这种方式在不同的“环境”中重用相同的功能。如果我可以在导入时覆盖它,那么定义ainside也是有意义的。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

我想你的代码比这个例子更复杂,所以我建议你尝试使用一个类:

你的类.py

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

    def f(self):
        print self.a

你的其他文件.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 回答