3

次のようなことを行う Python でモジュールを確認できます。

try:
  import some_module
except ImportError:
  print "No some_module!"

しかし、try/except は使いたくありません。これを達成する方法はありますか?(Python 2.5.x で動作するはずです。)

注: try/except を使用しない理由は任意です。例外を使用せずにこれをテストする方法があるかどうかを知りたいからです。

4

4 に答える 4

7

リクエストを実行するには巧妙な方法が必要です (そして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 を提供していません;-)。

于 2009-08-03T22:20:54.943 に答える
1

Python がモジュールを検索してインポートする方法については、こちらを参照してください。必要に応じて、このロジックを Python で複製し、sys.modules、sys.meta_path、および sys.path を検索して、必要なモジュールを探すことができます。

ただし、例外処理を使用せずに (コンパイルされたバイナリ モジュールを考慮して) 正常に解析されるかどうかを予測することは非常に難しいと思います!

于 2009-08-03T21:03:27.563 に答える
0

モジュールをインポートするすべてのメソッドは、呼び出されたときに例外を発生させます。最初に自分でファイルシステムを検索してファイルを探すこともできますが、考慮すべきことがたくさんあります。

tryなぜ/を使いたくないのかわからないexcept。これは、私が提供したものよりもはるかに優れた最良のソリューションです。try/を使用しない理由が無効である可能性があるため、最初にそれを明確にする必要がありますexcept

于 2009-08-03T20:59:56.510 に答える
-1

sys.modules辞書には、必要な情報が含まれているようです。

于 2009-08-03T21:02:49.547 に答える