自分のように見えない自己変更コードシステムを意図的に設定しない限り、達成しようとしていることには多くの問題があります。
1.グローバル変数
spam = 100
def set_spam(value):
spam = value
foo = reload(foo) #reload module from itself
これは機能しません。Pythonクロージャがどのように機能するかにより、行は関数内にspam = value
新しいローカル変数を作成しますが、これは使用されません。グローバルの値を適切に変更するには、次のようにキーワードを使用する必要があります。spam
set_spam
spam
global
spam = 100
def set_spam(value):
global spam
spam = value
2.「自分自身から」モジュールをリロードする
私の知る限り、これを実際に行う方法はありませんし、そうする必要もありません。import
-edしたモジュールは、他のモジュールからから呼び出されます__main__
。その呼び出し元のモジュールから更新するだけです。はい、モジュールの自己インポートを試みることはできますが(mgilsonが言及しているように、無限ループの問題が発生する可能性があります)、それでも( "foo"という名前の例を使用して)、モジュール自体をインポートする場合は、を持っていてfoo.foo
、foo.reload(foo)
(それが有効な場合でも)のようなことを行うとfoo
、ベースではなくサブをリロードするだけです。
3.まったくリロードfoo.py
します
# ==================================
# foo.py
spam = 100
def set_spam(value):
global spam
spam = value
このコードの先頭で、に100を割り当てていることに注意してくださいspam
。 モジュールをインポートするたびに、それを再度実行します。したがって、spam
インポートされたコードでの値をすでに変更している場合でもfoo
、モジュールをリロードすると、実際に行った変更は破棄されます。例:
>>> import foo
>>> foo.spam
100
>>> foo.spam = 9
>>> foo.spam
9
>>> reload(foo)
>>> foo.spam
100
したがって、変数に加えた変更をで保持したい場合は、モジュールをリロードしないfoo
でください。さらに、変更するために関数を使用する必要もありません。私が行ったように、直接設定するだけです。set_spam
spam
4.この「変更された」モジュール値を他のモジュールで使用しようとしています
最後に、あなたがやろうとしていることを私が正しく理解していれば、それはうまくいきません。これは主に、パート3で述べたことが原因です。ロードするたびfoo
に、spam=100
行はの値をリセットしますspam
。foo
同様に、モジュールを他の2つの異なるモジュールにインポートする場合、それぞれがモジュールをインポートするとspam = 100
、他のモジュールが行うこととは完全に独立して、それぞれがで始まりますfoo.spam
。たとえば、両方bar1.py
に次bar2.py
の行が含まれている場合import foo
:
>>> import bar1, bar2
>>> bar1.foo.spam
100
>>> bar2.foo.spam
100
>>> bar1.foo.spam = 200
>>> bar1.foo.spam
200
>>> bar2.foo.spam
100
あなたがやろうとしていることについてのより多くの説明があれば、コードをより良く機能させるためにコードを再構築するのを手伝うことができます。