多级__getitem__覆盖问题

时间:2014-04-02 07:32:40

标签: python object dictionary

所以我有一个自定义Python对象,其行为类似于dict,但会进行一些自解析和自我验证。

我正在编辑__setitem__以验证更新dict的尝试。这适用于dict中的顶级项目,但在子代码中,我似乎无法检测到正在发生更改,即使它正在发生。

示例:

"command":{
"name":"go.py",
"arguments":[
    {
    "variable":"length",
    "value":100
    }

]

 }

# in my object
    def __setitem__(self,key,item):
        print key
        if key is 'name':
            assert type(item) is str or type(item) is unicode, 'Type of name is '+str(type(item))+' should be str'
            assert item.endswith('.py'), 'command name must end in .py'
            self.name = item
        else:
            self.__dict__[key]=item 

为了弄清楚如何处理多层次的东西,我想打印出密钥。当我对此进行测试时,我发现名称编辑工作完美,每当我进行更改时,它都会尽职尽责地打印“名称”。但如果我改变论点, 没有打印,但是进行了更改。这非常令人沮丧。有关如何验证此多级输入的任何提示?

2 个答案:

答案 0 :(得分:0)

对象无法控制对其包含的其他对象的更改。如果执行myObj['arguments']['variable'] = 2,则由嵌套对象处理,而不是外部对象。这是因为首先评估myObj['arguments']。它评估某个对象,然后在对象上调用__setiem__,而不是myObj

如果希望外部对象控制它,则需要使嵌套对象成为“知道”嵌套位置的特殊对象,并询问其父对象是否可以进行修改。

答案 1 :(得分:0)

这是因为您正在更改嵌套对象而不使用下方对象的设置项。

有几种解决方法:

1。 而不是使用:

myObj['arguments']['variable'] = 2

使用:

myObj['arguments'] = {'variable':length,'value':2}

2。 使嵌套字典成为自定义对象

3
添加设置项目方法

def setVariable(self, x):
    ****Assertions HERE ****
    self['arguments']['variable'] = 2