强制导入方法使用本地变量
我有一个模块'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的方法,所以我不能修改这个模块,也不想把这个方法复制到我的模块中去修改。
我该如何覆盖另一个模块的局部变量,让导入的方法使用新的变量呢?
2 个回答
1
你不能这样做。这是设计使然。每个模块都有自己的命名空间。
不过,你可以先保存当前变量的值,然后给它赋一个新值,调用方法后再把原来的值恢复回来。
# 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在评论中提到的,这种方法要小心使用。它基本上算是一种变通的做法。我能想到的唯一有效的用途就是测试或者在其他所有方法(包括查克·诺里斯)都失败后作为最后的手段。
1
我建议你最好不要使用这种方法。可以把变量作为函数的参数传递,或者使用一个类把值封装起来。
如果你还是想这样做:
可以试试内置的 exec
函数:
在所有情况下,如果省略了可选部分,代码会在当前的作用域中执行。如果只指定了第一个表达式,它应该是一个字典,这个字典会用于全局和局部变量。如果给了两个表达式,它们分别用于全局和局部变量。如果提供了局部变量,可以是任何映射对象。
下面是一个可以运行的代码:
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$