6

class ExceptionPython 2.xの署名は何ですか?

それをサブクラス化し、独自の引数を追加し、正しく呼び出しsuperます。

次のコードが機能します。

class FooError(Exception):
    def __init__(self, msg, x):
        super(FooError, self).__init__(msg)
        self.x = x

しかし、ドキュメントやリファレンスはありますか? pydoc Exception役に立ちません。ドキュメントもありません: thisまたはthis

4

3 に答える 3

3

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;
}

ご覧のとおり、キーワード引数は許可されていません。argsnewでタプルとして初期化されます。

したがって、すべての署名は次のようになります。

def __init__ ( self, *args )

そして例外から継承(引数を制限せずに)

class FooError ( Exception ):
    def __init__ ( self, x, *args ):
         Exception.__init__ ( self, *args )
         self.x = x

私は常に基本クラスを明示的に呼び出しますが、 superは好きではありません。しかし、これは単にスタイルの問題です。

コードが正しいことに注意してください。タプルを処理できる一方で、引数を 1 つだけ受け取るようにExceptionを制限するだけです。

于 2015-04-27T17:28:21.443 に答える
0

__init__()クラスのExceptionは次のようになっていると思います。

def __init__(self, obj):
    # do something

しかし、Python の Web サイトでドキュメントが見つかりません。これは、Python のソース コードを読むことによってのみ確認できます。

于 2014-12-23T16:41:44.473 に答える