コードのどこかにモジュールをインポートしたかどうかを確認するにはどうすればよいですか?
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'].objectname
from packagename import nestedmodulename
セットnestedmodulename = sys.modules['packagename.nestedmodulename']
(このインポートの前nestedmodulename
にpackagename
名前空間に名前が付けられたオブジェクトがなかった場合のみ、ネストされたモジュールの追加の名前がこの時点で親パッケージの名前空間に追加されます)from somemodule import objectname as altname
セット altname = sys.modules['somemodule'].objectname
from 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()
インポートしたくないモジュールの上部に(または選択した他の例外を)配置するだけです。あなたがいる場合か、実際にどこかにそれをインポートし、あなたのプログラムは、トレースバックをスローして終了します。