例子:
$ 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
inside也是有意义的。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
. 我猜,这就是存在的可观察的、非虚拟的区别。