2011-04-13 3 views
1

사용시 :파이썬 : 나가서 설명하자면 NameError I가 다음 오류 발생 중첩 클래스

from sshop.engine.models import WrongJsonError 

class JsonCleaner: 


    class NormalizeError(Exception): 

     ERROR_NO_CODE = 0 
     ERROR_TYPE_MISMATCH = 1 
     ERROR_WRONG_VALUE = 2 
     ERROR_LACK_OF_FIELD = 3 

     def __init__(self, error_desc, error_code=ERROR_NO_CODE): 
      self.error_desc = error_desc 
      self.error_code = error_code 

     def __unicode__(self): 
      return repr(self.error_desc) 


    # .... some methods ........ 


    ERROR_CODES_MAPPING_DICT = { 
     # Line where exception is raised: 
     JsonCleaner.NormalizeError.ERROR_NO_CODE:  WrongJsonError.NO_ERROR, 
     JsonCleaner.NormalizeError.ERROR_LACK_OF_FIELD: WrongJsonError.ERROR_LACK_OF_FIELD, 
     JsonCleaner.NormalizeError.ERROR_TYPE_MISMATCH: WrongJsonError.ERROR_TYPE_MISMATCH, 
     JsonCleaner.NormalizeError.ERROR_WRONG_VALUE: WrongJsonError.ERROR_WRONG_VALUE, 
    } 

: 사전 ERROR_CODES_MAPPING_DICT 최초의 쌍 (이하 코드 참조) 오류를 일으키는

NameError: name 'JsonCleaner' is not defined 

라인을 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

클래스가 완전히 정의 될 때까지 이름이 실제로 바인딩되지 않으므로 클래스 범위 내에서 클래스 이름을 사용할 수 없습니다. dict 리터럴을 클래스 범위 외부로 이동하십시오.

JsonCleaner.ERROR_CODES_MAPPING_DICT = ... 
+0

감사합니다.이 문제가 해결되었습니다. – Alexander

3

그 시점에서 JsonCleaner가 완전히 정의되지 않았기 때문에 알려지지 않았습니다. 그것을 제거하고 NormalizeError.ERROR_NO_CODE를 사용하면 정상적으로 작동합니다.

+0

감사합니다. 너의 길은 또한 효과가있다. – Alexander

-1

"JsonCleaner"를 "self"로 바꾸어보십시오.

ERROR_CODES_MAPPING_DICT = { 
    # Line where exception is raised: 
    self.NormalizeError.ERROR_NO_CODE:  WrongJsonError.NO_ERROR, 
    self.NormalizeError.ERROR_LACK_OF_FIELD: WrongJsonError.ERROR_LACK_OF_FIELD, 
    self.NormalizeError.ERROR_TYPE_MISMATCH: WrongJsonError.ERROR_TYPE_MISMATCH, 
    self.NormalizeError.ERROR_WRONG_VALUE: WrongJsonError.ERROR_WRONG_VALUE, 
} 
+1

'self '도 존재하지 않습니다. 그것은 메소드 중 하나의 인수로 전달되기 때문에 메소드 내에 만 존재합니다. –

관련 문제