次の 2 つのモジュール、prog.py と err.py について考えてみましょう。どちらも、この問題を示す大規模なプログラムの例です。機能を小さなソース ファイルに分割し、それぞれにテスト ベンチを配置する必要があります。
Err.py にはテスト ベンチが含まれています。prog オブジェクトを作成すると、例外の呼び出し方法に応じて、例外がキャッチされるかどうかが決まります。
prog.py が「from err import *」ステートメントで err オブジェクトをインポートしても、モジュール名はまだ推測されているようですが (間違っていますか?)、それが参照する err はモジュール自体と同じものではないようです。
これは Python 2.7 のバグですか、それとも意図した動作ですか?
両方のファイルを取得して err.py を実行するだけで、私の言いたいことがわかります..
最初のファイル:
#prog.py
from err import *
class prog(object):
def func1(self):
raise MySubError
def func2(self):
doError()
そして2番目のファイル:
#err.py
import prog
import inspect
import sys
class myError(Exception):
pass
class MySubError(myError):
pass
def doError():
raise MySubError
if __name__=="__main__":
p=prog.prog()
try:
doError()
except MySubError as er:
print type(er)
print "Captured 1"
except Exception as er:
print type(er)
print "Not Captured 1"
try:
p.func1()
except MySubError as er:
print type(er)
print "Captured 2"
except Exception as er:
print type(er)
print "Not captured 2"
try:
p.func2()
except MySubError as er:
print type(er)
print "Captured 3"
except Exception as er:
print type(er)
print "Not captured 3"
どうにかして err はそれがどのモジュールであるかを知る必要があり、例外は単に MySubError ではなく err.MySubError である必要があるように私には思えます。モジュールは取得できますが、インスタンスは取得できません.....
出力:
<class '__main__.MySubError'>
Captured 1
<class 'test.MySubError'>
Not captured 2
<class 'test.MySubError'>
Not captured 3