0

実行時に、Python コードはロードするサブモジュールの名前を取得しますが、これは以前はわかりませんでした。ここで、このサブモジュールが既存のモジュール内に存在するかどうかを確認したいと思います。foobarを指定できるこの構造を考えてみましょう。

master/
|
|- __init__.py
|
|- foo/
|  |
|  |- __init__.py
|
|- bar/
   |
   |- __init__.py

さて、通常はこれを行います。これは定義と変数に対して機能します。

import master

unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
    pass # all's well

または、同じように機能する AttributeError をキャッチしています。

ただし、上記のファイル構造では、このアプローチを立ち上げて機能させることができません。hasattr()は常に False を返します (つまり、常に AttributeError がスローされます)。

を見るとdir(master)、次の出力が表示されます。

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

inを明示的に指定__all__master/__init__.pyても役に立ちませんが、dir() を

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

私が間違っていること、またはこれらの種類のテストを達成する方法があるかどうか、何か考えはありますか? (ちなみに: Win/Cygwin 上の Python 2.6、興味があれば)

4

3 に答える 3

2

サブモジュールは、明示的に記述されていない限り、親モジュールの属性ではありません。モジュールをインポートしてキャッチしてみてくださいImportError

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass
于 2010-07-13T13:04:41.827 に答える
1

できるよ

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'
于 2010-07-13T13:03:41.203 に答える