2016-07-28 69 views
2

我有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://stackoverflow.com/questions/4758562/modifying-a-variable-in-a-module-imported-using-from-import)。 [好回答](http://stackoverflow.com/a/4764225/6525140)。 – mhoff

回答

2

你想實現的是不可能的。 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