次のようなことを行う Python でモジュールを確認できます。
try:
import some_module
except ImportError:
print "No some_module!"
しかし、try/except は使いたくありません。これを達成する方法はありますか?(Python 2.5.x で動作するはずです。)
注: try/except を使用しない理由は任意です。例外を使用せずにこれをテストする方法があるかどうかを知りたいからです。
次のようなことを行う Python でモジュールを確認できます。
try:
import some_module
except ImportError:
print "No some_module!"
しかし、try/except は使いたくありません。これを達成する方法はありますか?(Python 2.5.x で動作するはずです。)
注: try/except を使用しない理由は任意です。例外を使用せずにこれをテストする方法があるかどうかを知りたいからです。
リクエストを実行するには巧妙な方法が必要です (そしてraise
、PEP 302 でインポート フックが "I don't deal with this path item" と言う唯一の方法であるため、1 つのステートメントは実際には避けられません)。try
/を避けるでしょうexcept
:
import sys
sentinel = object()
class FakeLoader(object):
def find_module(self, fullname, path=None):
return self
def load_module(*_):
return sentinel
def fakeHook(apath):
if apath == 'GIVINGUP!!!':
return FakeLoader()
raise ImportError
sys.path.append('GIVINGUP!!!')
sys.path_hooks.append(fakeHook)
def isModuleOK(modulename):
result = __import__(modulename)
return result is not sentinel
print 'sys', isModuleOK('sys')
print 'Cookie', isModuleOK('Cookie')
print 'nonexistent', isModuleOK('nonexistent')
これは以下を出力します:
sys True
Cookie True
nonexistent False
try
もちろん、これらは、完全に正常な/を回避するという無意味な目的のために実生活で行くにはばかげた長さexcept
ですが、提起された要求を満たしているようです (そして、うまくいけば、Python ウィザード志望者が独自の研究を開始するよう促すことができます --このコードのすべてが要求どおりに機能する方法と理由を正確に知ることは、実際には有益です。そのため、詳細な説明と URL を提供していません;-)。
Python がモジュールを検索してインポートする方法については、こちらを参照してください。必要に応じて、このロジックを Python で複製し、sys.modules、sys.meta_path、および sys.path を検索して、必要なモジュールを探すことができます。
ただし、例外処理を使用せずに (コンパイルされたバイナリ モジュールを考慮して) 正常に解析されるかどうかを予測することは非常に難しいと思います!
モジュールをインポートするすべてのメソッドは、呼び出されたときに例外を発生させます。最初に自分でファイルシステムを検索してファイルを探すこともできますが、考慮すべきことがたくさんあります。
try
なぜ/を使いたくないのかわからないexcept
。これは、私が提供したものよりもはるかに優れた最良のソリューションです。try
/を使用しない理由が無効である可能性があるため、最初にそれを明確にする必要がありますexcept
。
sys.modules辞書には、必要な情報が含まれているようです。