2013-06-11 55 views
2

新的python用戶(2.7.5)。正在拆分Python用戶定義的異常字符串

試圖實現一個簡單的例外。異常派生類正在接受字符串輸入參數並將它們分解爲單個字符。

我在教程和計算器上查找了大約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

其實它並不像你告訴我的那樣工作。我將x.args的值作爲「test」[字符串]。我不知道你的問題是什麼 –

+0

謝謝大家的幫助。 – user2475059

回答

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 

無論是那些應該解決的問題之一,但我建議你第二個,因爲它是更Python。

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

如果我這樣做,並用a.args [0]替換a.args,它會給我我想要的。不過,我想了解它們之間的差異,因爲我不知道你在說什麼,或者爲什麼代碼不像教程所說的那樣行事。有沒有一個模塊的Exception類定義,我可以閱讀? – user2475059

+0

@ user2475059如果您不知道我在說什麼,那麼您需要重新學習Python(或者至少通過主Python教程閱讀[http:// docs。python.org/tutorial/index.html])。屬性和參數列表是Python提供的兩個非常有用的功能,參數列表(或者至少可以像這樣解開迭代文件的功能)在許多Python程序中使用。 – JAB

+0

我指定了2.7.5。教程說它是2.7.5。我不記得在本教程中看到任何有關屬性或參數列表的內容,但是自從我上次仔細閱讀它之後已經有一段時間了。 – user2475059

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

原來的價值是如何工作的,使用Exception本身的一些例子成一個元組。

在Python代碼

所以,

self.args = arg 

觸發setter和導致self.args被設置爲一個元組。

+0

所以我說得對。 – JAB

+0

我是否瞭解BaseException的__init__被調用? 如何在這裏強調一下? – user2475059

+0

@ user2475059:Python有一套[複雜的屬性查找規則](http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html)。這些規則允許基類定義[數據描述符](http://users.rcn.com/python/download/Descriptor.htm),它改變了'self.args = args'行爲的方式。它與被調用的'BaseException .__ init__'沒有任何關係(它沒有)。爲了避免下劃線,用反引號(')包圍字符串。 – unutbu