コードのどこかにモジュールをインポートしたかどうかを確認するにはどうすればよいですか?
if not has_imported("somemodule"):
print('you have not imported somemodule')
すでにモジュールをインポートしたかどうかを確認したいのは、プログラムを台無しにすることがあるため、インポートしたくないモジュールがあるためです。
コードのどこかにモジュールをインポートしたかどうかを確認するにはどうすればよいですか?
if not has_imported("somemodule"):
print('you have not imported somemodule')
すでにモジュールをインポートしたかどうかを確認したいのは、プログラムを台無しにすることがあるため、インポートしたくないモジュールがあるためです。
回答:
sys.modules辞書でモジュール名をテストします。
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
文書から:
これは、モジュール名をすでにロードされているモジュールにマップする辞書です。
importステートメントは2つのことを行うことに注意してください。
sys.modules)、モジュールがロードされ、に追加されsys.modulesます。式はmodulename not in sys.modules、ステップ1が実行されたかどうかをテストします。手順2の結果をテストするには、importさまざまなオブジェクトを参照するためにさまざまな名前を設定するため、使用された正確なステートメントを知る必要があります。
import modulename セット modulename = sys.modules['modulename']import packagename.nestedmoduleセットpackagename = sys.modules['packagename'](追加する追加レベルの数に関係なく)import modulename as altname セット altname = sys.module['modulename']import packagename.nestedmodule as altname セット altname = sys.modules['packagename.nestedmodule']from somemodule import objectname セット objectname = sys.modules['somemodule'].objectnamefrom packagename import nestedmodulenameセットnestedmodulename = sys.modules['packagename.nestedmodulename'](このインポートの前nestedmodulenameにpackagename名前空間に名前が付けられたオブジェクトがなかった場合のみ、ネストされたモジュールの追加の名前がこの時点で親パッケージの名前空間に追加されます)from somemodule import objectname as altname セット altname = sys.modules['somemodule'].objectnamefrom packagename import nestedmodulename as altnameセットaltname = sys.modules['packagename.nestedmodulename'](このインポートの前nestedmodulenameにpackagename名前空間に名前が付けられたオブジェクトがなかった場合のみ、ネストされたモジュールの追加の名前がこの時点で親パッケージの名前空間に追加されます)インポートされたオブジェクトがバインドされた名前が特定の名前空間に存在するかどうかをテストできます。
# is this name visible in the current scope:
'importedname' in dir()
# or, is this a name in the globals of the current module:
'importedname' in globals()
# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])
これは、名前が存在する(バインドされている)ことを通知するだけであり、特定のモジュールまたはそのモジュールのオブジェクトを参照している場合は通知しません。それ以降sys.modules、名前が完全に別の名前に設定されていることを除外する必要がある場合は、そのオブジェクトをさらに内省したり、で使用可能なオブジェクトと同じオブジェクトであるかどうかをテストしたりできます。
numpyパッケージが必要だとしましょう-import sys関数内でインポートされたことを確認するのに最適ですか?「最良」とはimport sys、関数が呼び出されるたびに呼び出されるパフォーマンスへの影響という意味です。ありがとう
import sysは決して高価ではありません。sys常に存在し、デフォルトではすでにロードされています。ただし、オプションのパッケージの場合:パッケージをインポートするだけです。ImportErrorパッケージがインストールされていない場合は例外をキャッチし、インポートが成功したときにインストールされていることを示すフラグを設定します。その後、フラグを使用して、オプションの依存関係の使用を通知できます。
name in sys.modulesテストは、をインポートしたくない場合にのみ役立ちます。
sys.modulesを使用して、モジュールがインポートされているかどうかをテストします(例としてunicodedataを使用しています)。
>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True
if "sys" not in dir():
print("sys not imported!")
sysだけではなく、モジュール、何もすることができます。
raise SystemError()インポートしたくないモジュールの上部に(または選択した他の例外を)配置するだけです。あなたがいる場合か、実際にどこかにそれをインポートし、あなたのプログラムは、トレースバックをスローして終了します。