このコードは、このスレッドの回答から取得されました。__name__ == "__main __"の場合はどうなりますか?
# Suppose this is foo3.py.
def functionA():
print("a1")
from foo3 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
print("m1")
functionA()
print("m2")
print("t2")
(メインのpython3のfoo3.pyとして実行される場合)、私は次のようにコードが実行されると思う:
1.プリントT1
2.プリントM1
3. A1関数Aと印刷開始
こうして再びfoo3を実行して、foo3 4からインポート関数Bを。手順1に戻り
ます。分析を修正するのを手伝ってもらえますか?
「foo3
再度実行」するのではなく、foo3.py
スクリプトを再度実行します。最初foo3.py
に実行されたのはモジュールを作成すること__main__
であり、2回目はモジュールを作成することfoo3.py
でした。
動作は(ほとんど)実際にあるかのようにあなたが名前のファイルを持っていた__main__.py
し、別の名前のfoo3.py
両方のこれらのまったく同じ内容で、あなたはその後、実行しますpython __main__.py
。これが起こっていることです。
ただ、Pythonはそれを偽造して、実際のPythonファイルが何であるかに関係なく名前が付けられたスクリプトからプログラムが開始された __main__.py
かのように見せます。反対の唯一の明白な兆候__file__
は、実際のスクリプトのファイル名、つまりを伝えること/spam/ham/eggs/foo3.py
です。
無限ループにならない理由はimport
、で指定された名前のモジュールを探すためです。モジュールsys.modules
がすでに存在する場合は、新しいファイルは実行されません。起動時に、Pythonは__main__
inのエントリを作成しsys.modules
、起動スクリプト(foo3.py
)のコードはこのモジュールのスコープ内で実行されます。
次に、ステートメントを実行するときに、にエントリがあるimport foo3
かどうかを確認foo3
しsys.modules
ます。そこにないため、という名前の新しい空のモジュールfoo3
が作成され、に配置されsys.modules
、のコードfoo3.py
がこの新しい空のモジュールのスコープ内で実行されます。
最終的にimport
2回目に実行されます。今回は foo3
にsys.modules
あるので、インポートしてもスクリプトは作成またはロードされず、すでにロードされているモジュールが返されるだけです。
「無限」ループを取得するには、再度sys.module
インポートfoo3
する前に、インポート済みのモジュール参照を削除します。
import sys
def functionA():
print("a1")
if 'foo3' in sys.modules:
del sys.modules['foo3']
from foo3 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
print("m1")
functionA()
print("m2")
print("t2")
そして実行すると、
[....]
File ".../foo3.py", line 7, in functionA
from foo3 import functionB
File ".../foo3.py", line 17, in <module>
functionA()
File ".../foo3.py", line 7, in functionA
from foo3 import functionB
RuntimeError: maximum recursion depth exceeded while calling a Python object
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加