これは次の内容ですscript_one.py
。
x = "Hello World"
これは次の内容ですscript_two.py
。
from script_one import x
print(x)
今、実行した場合script_two.py
、出力は次のようになります。
>>> Hello World
必要なのは、x
インポートされたかどうかを検出する方法です。
これは、ソース コードが次のようになると私が想像するものですscript_one.py
。
x = "Hello World"
if x.has_been_imported:
print("You've just imported \"x\"!")
私が走った場合、script_two.py
出力は「すべきである」こと。
>>> Hello World
>>> You've just imported "x"!
これは何と呼ばれていますか、この機能は Python 3 に存在し、どのように使用しますか?
できません。申し訳ありませんが、これを検出するために費やされた努力は時間の無駄です。
Python インポートは、次の手順で構成されます。
sys.modules
。
sys.modules
、トップレベル コードを実行した結果のすべてのオブジェクトが含まれます。import
選択した正確なバリアントによって異なります。
import module
名前module
をsys.modules[module]
オブジェクトにバインドしますimport module as othername
名前othername
をsys.modules[module]
オブジェクトにバインドしますfrom module import attribute
名前attribute
をsys.modules[module].attribute
オブジェクトにバインドしますfrom module import attribute as othername
名前othername
をsys.modules[module].attribute
オブジェクトにバインドしますこのコンテキストでは、Python の名前は単なる参照であることを理解することが重要です。すべての Python オブジェクト (モジュールを含む) はヒープ上に存在し、それらへの参照の数に応じて変化します。これがどのように機能するかについての入門が必要な場合は、Ned Batchelder による Python 名に関するこの素晴らしい記事を参照してください。
あなたの質問は、次の 2 つの方法で解釈できます。
x = "Hello World"
)、インポートされます。それのすべて。Python はここだけ x
でロードするのではなく、オール オア ナッシングです。gc.get_referrers()
オブジェクト チェーンを再帰的にチェックして、他の Python オブジェクトが現在参照してx
いる可能性があるものを確認することを含む膨大なタスクです。後者の目標は、次のシナリオのいずれかでさらに難しくなります。
import script_one
、次に使用しscript_one.x
ます。このような参照は、検出するには短すぎる可能性があります。from script_one import x
、それからdel x
。インポートされた名前空間内で他の何かがまだ同じ文字列オブジェクトを参照していない限り、その参照はなくなり、検出できなくなります。import sys; sys.modules['script_one'].x
同じ文字列オブジェクトを参照する正当な方法ですが、これはインポートとしてカウントされますか?import script_one
、list(vars(script_one).values())
モジュールで定義されているすべてのオブジェクトのリストを作成しますが、これらの参照はリスト内のインデックスであり、名前が付けられていません。これは輸入としてカウントされますか?この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加