导入使用模块级变量的函数

时间:2012-09-24 19:13:39

标签: python import module

示例:

$ 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时。我猜这是可观察的,非虚拟的区别。

2 个答案:

答案 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()

如果没有更多的背景,我无法提供更多建议。