2016-10-17 8 views
0

Python 3の次の例外がどのように初期化されるのか混乱します。基本例外はどのように初期化されていますか?

のPython 3では
class MyException(Exception): 

    def __init__(self,msg,foo): 
     self.foo = foo 

raise MyException('this is msg',123) 

、この出力:

Traceback (most recent call last): 
    File "exceptionTest.py", line 7, in <module> 
    raise MyException('this is msg',123) 
__main__.MyException: ('this is msg', 123) 

がどのように引数が初期化され得ていますか?私はスーパークラスの初期化子を呼び出していないので、トラックバックにargsが表示されているのに驚いています。

Python 2では、以下の出力が得られます。これは、argsがトレースバックに含まれていないため、私にとって意味があります。それがエラーのこの一般的なケースを処理するために特別にそこに置かれている__new__方法を持っているという点で

Traceback (most recent call last): 
    File "exceptionTest.py", line 7, in <module> 
    raise MyException('this is msg',123) 
__main__.MyException 

答えて

2

のPython BaseExceptionクラスは特別です。

いいえ、BaseException.__init__は呼び出されていませんが、BaseException.__new__です。あなたは__new__をオーバーライドして、self.argsの設定を抑制するために渡された引数を無視することができます。

>>> class MyException(Exception): 
...  def __new__(cls, *args, **kw): 
...   return super().__new__(cls) # ignoring arguments 
...  def __init__(self,msg,foo): 
...   self.foo = foo 
... 
>>> MyException('this is msg', 123) # no need to raise to see the result 
MyException() 

このほかは、Python 3に固有のものであり、動機や詳細については、Pythonの2を参照してくださいissue #1692335には存在しません。

関連する問題