新的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')
唯一的变化是在类继承中。
我想在我的异常类中将我的字符串放在一个部分中,这样我就可以实际打印和阅读它们。发生了什么事?
答案 0 :(得分: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')
答案 1 :(得分:4)
Exception类使args
成为属性(数据描述符)with this setter:
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
触发setter并使self.args
设置为元组。