这可能是一个非常天真的问题,也许最好问一个例子:
module1.py
import module2
def new_func():
print(var_string)
module2.new_func = new_func
module2.func()
module2.new_func()
module2.py
var_string = "i'm the global string!"
def func():
print(var_string)
结果
> python module1.py
i'm the global string!
Traceback (most recent call last):
File "module1.py", line 8, in <module>
module2.new_func()
File "module1.py", line 4, in new_func
print(var_string)
NameError: name 'var_string' is not defined
所以我的问题是: 是否可以将一个函数插入一个模块并相应地更新它的全局命名空间?
相关:global variable defined in main script can't be accessed by a function defined in a different module 请注意,我知道共享全局变量是一个坏主意,我也知道配置模块将是一个很好的妥协,但请注意,这不是我想要实现的。
答案 0 :(得分:0)
您可能认为它很有用,但很少有python代码以这种方式编写,我认为大多数python程序员会对执行此操作的代码感到困惑。在导入模块之后修改模块(monkeypatching)通常被忽视,因为它很容易做错事并导致奇怪的错误。
你做了一个类比,将它与类上的重写/扩展方法进行比较,但如果这真的是你想要做的,为什么不使用一个类呢?类的特性使得这样做更安全,更容易。
如果您执行此操作,您的代码将起作用:
from module2 import var_string
#or..
from module2 import *
但我不确定这是否是您正在寻找的解决方案。无论哪种方式,我个人都不会尝试使这个代码工作,它正在与python代码通常编写的方式作斗争。如果您有一个实际的代码示例,您认为可以通过动态修改模块来改进,我希望看到它。使用您提供的示例代码很难看到它的好处。
答案 1 :(得分:0)
我不明白你想要什么,以及这个字符串必须做什么“module2.new_func = new_func”,因为你没有函数new_funcin module2。 但是如果你想在每个模块中重置变量,你就不能这样使用:
第1单元:
import module2
def new_func():
print(var_string)
new_class=module2.MyStuff()
var_string=new_class.func()
new_func()
第2单元:
class MyStuff:
def __init__(self):
self.var_string = "i'm the global string!"
def func(self):
print(self.var_string)
return self.var_string