例外签名

时间:2013-08-09 22:08:44

标签: python python-2.7

python 2.x中class Exception的签名是什么?

我希望对它进行子类化并添加我自己的参数,同时也正确地调用super

以下代码有效:

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

但是,是否有一些文档或参考? pydoc Exception无效。文档也不是:thisthis

3 个答案:

答案 0 :(得分:2)

你有什么好的。可替换地,

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

来自docs

  

派生类中的重写方法实际上可能需要扩展   而不是简单地替换同名的基类方法。   有一种简单的方法可以直接调用基类方法:只是   调用BaseClassName.methodname(self,arguments)。这有时是偶然的   对客户也很有用。 (请注意,这只适用于基础   class可以作为全局范围内的BaseClassName访问。)

答案 1 :(得分:1)

这部分Python文档在方法签名方面并不十分明确,但有一些提示。

引用Python文档(6.内置异常):

  

......除非另有说明,否则它们会显示“相关值”   错误的详细原因。这可能是字符串或元组   包含几项信息......

BaseException指出以下内容:

  

ARGS

     

赋予异常构造函数的参数元组。

和例外:

  

在版本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 )

继承自Exception(不限制参数)

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

我总是明确地调用基类,我不喜欢 super 。但这只是一个风格问题。

请注意您的代码是正确的。您只需将 Exception 限制为只接收一个参数,而它可以处理元组。

答案 2 :(得分:0)

我认为异常__init__()是这样的:

def __init__(self, obj):
    # do something

但我在Python的网站上找不到文档。这只能通过阅读Python的源代码来确认。