Python从导入的文件中提取变量

问题描述:

我有3个文件。一个用于定义变量,另外两个包含所需的模块。Python从导入的文件中提取变量

variable.py

my_var = "" 

test.py

import variable 

def trial(): 
    variable.my_var = "Hello" 

main.py(不工作)

from variable import * 
from test import trial 

if __name__ == "__main__": 
    trial() 
    print my_var 

当我运行main.py,它什么都不给。但是,如果我改变main.py这样,

main.py(工作)

import variable 
from test import trial 

if __name__ == "__main__": 
    trial() 
    print variable.my_var 

,它给了我预期的输出,即Hello

对我而言,variable.py包含更多变量,我不想在访问它们时使用variable.<variable name>。在修改它们时,使用variable.<variable name>并不是问题,因为根据用户的输入我只能修改一次,然后在多个文件中多次访问它们。

现在我的问题是,有没有办法将main.py中的所有变量在被test.py修改之后提取出来并使用它们而没有前缀variable.

+1

如果从可变进口*'你是从模块添加名字''做对variable'地方名称空间,因此它们在导入时指向变量的值。如果现在您更改了原始模块,则该更改将不会反映在导入的符号中。 – dhke

+0

@dhke是的,我从这两个变体的工作理解。但我的问题有些不同。 – RatDon

+2

[相关问题](http://*.com/questions/4758562/modifying-a-variable-in-a-module-imported-using-from-import)。 [好回答](http://*.com/a/4764225/6525140)。 – mhoff

你想实现的是不可能的。 from MODULE import *将所有变量名称和值导入您的名称空间,但不导入变量本身。变量被分配在你的本地命名空间中,因此它们的值不会反映到它们的原点上。但是,对可变对象的更改会反映出来,因为您导入的值基本上是对实例的引用。

这就是为什么不推荐使用上述构造的不合格进口的众多原因之一。相反,你应该质疑你的程序结构和你所做的设计决定。长期来看,处理大量的模块级变量会变得非常麻烦和不便。

考虑使用更加结构化的方法来应用程序,例如使用类。

我再次想指出并给予this thread的学分,这本质上是解决同样的问题。


编辑为了完整起见。这是可能的,但不建议使用这种方法。你会在每次修改应用到其非引用变量的时间来重新导入模块:

from variable import * # optional 
from test import trial 

if __name__ == "__main__": 
    trial() 
    from variable import * # simply re-import the variables... 
    print my_var