强制导入的方法使用局部变量

时间:2011-08-26 14:17:54

标签: python import module scope

我有一个模块'b'从模块“a”导入方法,其中方法“a.method”使用“a”中定义的变量必须在“b”中覆盖。简单地说,在代码中:

module a.py:

local_var = 1
def method():
    print local_var

module b.py:

from a import method
local_var = 2
print method()

运行python b.py打印1,而不是2.在我的场景中,导入的方法是django 方法所以我不能修改模块,也不想将方法复制到我的模块并修改它。

如何覆盖另一个模块的局部变量并使用新变量mkae导入的方法?

2 个答案:

答案 0 :(得分:1)

你做不到。这是设计的。每个模块都有自己的命名空间。

但是,您可以保存var的当前值,分配新值,调用方法并恢复原始值。

# module a.py:

local_var = 1
def method():
    print local_var

# module b.py:

import a
old_local_var = a.local_var
a.local_var = 2
print method()
a.local_var = old_local_var

正如jyore在评论中指出的那样 - 应谨慎使用此方法。它或多或少是一种黑客攻击。我能想到的唯一有效用途是测试或最后的措施,当其他一切(包括Chuck Norris)失败时。

答案 1 :(得分:1)

尝试使用内置的exec功能:

  

在所有情况下,如果省略可选部分,则代码在当前范围内执行。如果只指定了in之后的第一个表达式,它应该是一个字典,它将用于全局变量和局部变量。如果给出两个表达式,则它们分别用于全局变量和局部变量。如果提供,则locals可以是任何映射对象。

但我认为你最好不要使用这样的黑客。将变量作为函数参数传递,或使用类。

工作代码:

a.py:

local_var = 1
def method():
    print local_var

b.py:

from a import method
import inspect

code = inspect.getsource(method)
local_var = 2
method()
print code
exec code
method()

python b.py

vic@ubuntu:~/Desktop$ python b.py
1
def method():
    print local_var

2
vic@ubuntu:~/Desktop$