Python ドキュメントのこの部分は、メソッド シグネチャに関してあまり明示的ではありませんが、いくつかのヒントがあります。
Python ドキュメントの引用 (6. 組み込みの例外):
...言及されている場合を除き、エラーの詳細な原因を示す「関連付けられた値」があります。これは、いくつかの情報項目を含む文字列またはタプルである可能性があります...
BaseException は次のように述べています。
引数
例外コンストラクターに渡される引数のタプル。
そして例外:
バージョン 2.5 で変更: BaseException を継承するように変更しました。
残りの情報はソースでしか見つけることができません(私は思う)
static int
BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds) {
if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
return -1;
Py_DECREF(self->args);
self->args = args;
Py_INCREF(self->args);
if (PyTuple_GET_SIZE(self->args) == 1) {
Py_CLEAR(self->message);
self->message = PyTuple_GET_ITEM(self->args, 0);
Py_INCREF(self->message);
}
return 0;
}
ご覧のとおり、キーワード引数は許可されていません。argsはnewでタプルとして初期化されます。
したがって、すべての署名は次のようになります。
def __init__ ( self, *args )
そして例外から継承(引数を制限せずに)
class FooError ( Exception ):
def __init__ ( self, x, *args ):
Exception.__init__ ( self, *args )
self.x = x
私は常に基本クラスを明示的に呼び出しますが、 superは好きではありません。しかし、これは単にスタイルの問題です。
コードが正しいことに注意してください。タプルを処理できる一方で、引数を 1 つだけ受け取るようにExceptionを制限するだけです。