示例:
$ 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:我给了它另一个想法并得出结论我可能想要使用一个闭包,原因是我不希望每个模块中的其他函数必须提供{{1调用a
时。我猜这是可观察的,非虚拟的区别。
答案 0 :(得分:0)
(如果我理解你的话) - 试试这个:
#m2.py
from m1 import f
import m1
m1.a = 2
f()
但是,我应该提一下,你需要这样做的事实在我的脑海中抛出了各种各样的花里胡哨 - 这似乎是一个非常糟糕的设计。
答案 1 :(得分: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()
如果没有更多的背景,我无法提供更多建议。