2016-07-28 7 views
2

私は3つのファイルを持っています。 1つは変数を定義するためのもので、他の2つは必要なモジュールを含みます。インポートされたファイルの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 

そして、私は0を実行します、何も分かりません。しかし、私はこのようなmain.pyを変更した場合、

main.py(作業)

import variable 
from test import trial 

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

そして、それは私に期待される出力すなわちHelloを与えます。

私のケースでは、より多くの変数が含まれており、アクセスする際にvariable.<variable name>を使用したくありません。それらを変更している間は、ユーザの入力に応じて一度だけ変更して、複数のファイルにまたがって複数回アクセスするので、variable.<variable name>を使用しても問題はありません。

main.pyの変数をtest.pyで修正して、接頭辞なしで使用すると、すべての変数を抽出する方法がありますか?variable.

+1

'from variable import * 'を実行すると、' 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 *は、すべての変数名と値を名前空間にインポートしますが、変数自体はインポートしません。変数はローカル名前空間に割り当てられているため、値の変更は原点に反映されません。ただし、インポートする値は基本的にインスタンスへの参照であるため、変更可能なオブジェクトの変更が反映されます。

これは、上記の構文を使用した非修飾インポートが推奨されない多くの理由の1つです。代わりに、あなたのプログラム構造とあなたが取った意思決定に疑問を呈してください。膨大な量のモジュールレベルの変数を扱うことは、面倒で、長期的には非常に不便になる可能性があります。

クラスを使用するなど、アプリケーションの構造化されたアプローチを考えてみましょう。

もう一度指摘し、同じ問題を解決するthis threadにクレジットを与えたいと思います。完全を期すために


EDIT。可能ですが、この方法はお勧めしません。

from variable import * # optional 
from test import trial 

if __name__ == "__main__": 
    trial() 
    from variable import * # simply re-import the variables... 
    print my_var 
関連する問題