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