Python:使用嵌套类时的NameError

时间:2011-04-13 15:03:06

标签: python

我遇到了以下错误:

NameError: name 'JsonCleaner' is not defined

导致错误的行是字典ERROR_CODES_MAPPING_DICT中的第一对(请参阅下面的代码):

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, 
    }

我做错了什么?

3 个答案:

答案 0 :(得分:5)

类名称不能在类范围内使用,因为在完全定义类之前,名称实际上并未绑定。将dict文字移到类范围之外。

JsonCleaner.ERROR_CODES_MAPPING_DICT = ...

答案 1 :(得分:3)

Json Cleaner在那时尚未完全定义,因此未知。只需将其删除并使用Normalize Error.ERROR_NO_CODE就可以了。

答案 2 :(得分:-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, 
}