2

新的 python 用户 (2.7.5)。

试图实现一个简单的异常。异常派生类采用字符串输入参数并将它们拆分为单个字符。

我在教程和 stackoverflow 上环顾了大约 90 分钟,但没有找到答案。

# Meaningless base class.
class base:
    def __init__(self):
        self.base = 1

# Somewhat useful test of string storage.
class test(base):
    def __init__(self, arg):
        self.args = arg

这产生:

>>> a = test('test')
>>> a.args
'test'

但是当我尝试时:

# No qualitative difference between this and the above definition,
# except for 'Exception'.
class test(Exception):
    def __init__(self, arg):
        self.args = arg

我得到:

>>> a = test('test')
>>> a.args
('t', 'e', 's', 't')

唯一的变化是类继承。

我想把我的字符串放在我的异常类中,这样我就可以实际打印和阅读它们。怎么了?

4

2 回答 2

4

我自己并没有做出很多用户定义的异常,但我得到的印象是该self.args = arg语句正在触发一个属性设置器,该设置器转换arg为一个元组(tuple('test')结果 ('t', 'e', 's', 't'))。(根据 unutbu 的说法,我似乎是对的)。您可以尝试两件事:

class test(Exception):
    def __init__(self, arg):
        self.args = (arg,)

或者

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

其中任何一个都可以解决问题,但我推荐第二个,因为它更 Pythonic。使用它自己的一些例子Exception

>>> a = ['abc', 'def']
>>> Exception(a)
Exception(['abc', 'def'],)
>>> Exception(*a)
Exception('abc', 'def')
于 2013-06-11T15:37:32.257 回答
4

Exception 类使用这个 setterargs创建一个属性(数据描述符):

static int
BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
{
    PyObject *seq;
    if (val == NULL) {
        PyErr_SetString(PyExc_TypeError, "args may not be deleted");
        return -1;
    }
    seq = PySequence_Tuple(val);
    if (!seq) return -1;
    Py_CLEAR(self->args);
    self->args = seq;
    return 0;
}

线

seq = PySequence_Tuple(val);

将值转换为元组。

所以在你的 Python 代码中,

    self.args = arg

触发设置器并导致self.args设置为元组。

于 2013-06-11T15:44:26.733 回答