正在拆分的Python用户定义异常字符串

正在拆分的Python用户定义异常字符串,python,string,exception,init,Python,String,Exception,Init,新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

新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')
唯一的变化是类继承


我想让我的字符串在我的异常类中成为一个整体,这样我就可以打印和读取它们。发生了什么事?

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

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

这两种方法中的任何一种都可以解决这个问题,但我推荐第二种,因为它更像是python。使用
Exception
本身,这是如何工作的一些示例:

>>> a = ['abc', 'def']
>>> Exception(a)
Exception(['abc', 'def'],)
>>> Exception(*a)
Exception('abc', 'def')

异常类使
args
成为属性(数据描述符):

线路

seq = PySequence_Tuple(val);
将值转换为元组

在Python代码中

    self.args = arg

触发setter并将
self.args
设置为一个元组。

实际上,它并没有按照您告诉我的方式工作。我将x.args的值作为“test”[字符串]获取。我不知道你们的问题是什么。谢谢你们所有人的有用答案。如果我这样做并用a.args[0]替换a.args,它会给我想要的。不过,我想理解其中的区别,因为我不知道您在说什么,也不知道为什么代码没有按照教程所说的方式运行。是否有一个模块定义了我可以阅读的异常类?@user2475059如果你不知道我在说什么,那么你需要重新学习Python(或者至少阅读Python主教程[)。属性和参数列表是Python和参数列表提供的两个非常有用的功能(或至少能够将iterables解包)在许多Python程序中使用。我指定了2.7.5。教程说它是为2.7.5编写的。我不记得在教程中看到过任何关于属性或参数列表的内容,但自从上次仔细阅读它已经有一段时间了。@user2475059是的,我注意到在我删除了Python 2/3注释之后,我建议使用教程ial可从我链接的Python文档中获得;它是我第一次启动Python时使用的,非常有用。我是否理解BaseException的init调用?以及如何在此处转义下划线?@user2475059:Python有一个。这些规则允许基类定义改变
self.args=args
行为。它与
BaseException无关。\uuuu init\uuuu
被调用(它不会)。若要转义下划线,请在字符串周围加上反勾(`)。
seq = PySequence_Tuple(val);
    self.args = arg