2013-06-11 4 views
2

새로운 파이썬 사용자 (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

사실 그것은 당신이 나에게 말한 방식대로 작동하지 않습니다. x.args 값을 "test"[문자열]로 얻습니다. 나는 당신의 문제가 무엇인지 모른다. –

+0

도움이되는 답변을 해주셔서 감사합니다. – user2475059

답변

4

나는 많은 사용자 정의 예외 나 자신을하지 않은,하지만 난 self.args = arg 문이 튜플 (('t', 'e', 's', 't')에서 tuple('test') 결과)에 arg 변환하는 속성 setter을 유발한다는 인상을 얻을. (그리고 나는 unutbu에 의하면, 내가 옳았다 고 생각한다.) 당신이 시도 할 수있는 두 가지 :

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

또는

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

어느 문제를 해결해야 그 중 하나지만, 더 파이썬의 나는이 두 번째를 권 해드립니다.

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

값을 변 :

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

내가 그 일을하고 a.args를 a.args [0]로 바꾸면, 내가 원하는 것을 줄 것이다. 차이점을 이해하고 싶습니다. 그러나 여러분이 무슨 말을하는지, 코드가 자습서가 말하는 방식대로 행동하지 않는 이유를 알지 못해서입니다. 내가 읽을 수있는 Exception 클래스가 정의 된 모듈이 있습니까? – user2475059

+0

@ user2475059 내가 무슨 말하는지 모르겠다면, 파이썬을 다시 배워야합니다. (또는 적어도 파이썬 튜토리얼 [http : // docs.python.org/tutorial/index.html]). 속성과 인수 목록은 Python에서 제공하는 두 가지 매우 유용한 기능이며 많은 Python 프로그램에서 인수 목록 (또는 iterable을 언팩하는 기능)이 사용됩니다. – JAB

+0

2.7.5를 지정했습니다. 이 튜토리얼에서는 2.7.5에 대해 설명합니다. 튜토리얼에서 속성이나 인수 목록에 대해 아는 것이 기억이 나지 않지만 마지막으로 자세히 읽은 이후로 오랜 시간이 걸렸다. – user2475059

4

예외 클래스는 args 속성 (데이터 기술자) with this setter가 있습니다 :이 자체 Exception을 사용하여 작동하는 방법의 예 튜플에 넣는다. 파이썬 코드 그래서

,

self.args = arg 

은 세터를 유발하고 self.args이 튜플로 설정됩니다.

+0

그래서 나는 옳았다. – JAB

+0

BaseException에 대한 __init__을 이해하고 있습니까? 여기에서 벗어나는 방법은 무엇입니까? – user2475059

+0

@ user2475059 : 파이썬에는 [복잡한 속성 조회 규칙 집합]이 있습니다 (http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html). 이러한 규칙은 기본 클래스가'self.args = args'가 동작하는 방식을 변경시키는 [데이터 디스크립터] (http://users.rcn.com/python/download/Descriptor.htm)를 정의 할 수있게합니다. 'BaseException .__ init__' 호출은 아무런 관련이 없습니다 (호출하지 않습니다). 밑줄을 이스케이프하려면 역 따옴표 (')로 문자열을 묶으십시오. – unutbu