已经问过这个问题,但是不完全是这样(我无法使用任何答案):我想调用一个返回字典的函数,如果这个字典不是None
,在其上循环并在对象上使用其键+值。注意:此对象来自一个类,其类不能修改。像这样:
def check_ok(s):
return {'prop_1': 'x',
'prop_2': 'y'}
def check_and_update(obj, st):
result = check_ok(st)
if result is not None:
for k, v in result.items():
obj.k = v # doesn't work, of course
解决方案是什么?
答案 0 :(得分:3)
您可以通过以下方式实现这一目标:
set_attr
方法将这些值添加到对象的字典中def check_ok(s):
return {'prop_1': 'x',
'prop_2': 'y'}
class UpdateableObject(object):
pass
def check_and_update(obj, st):
result = check_ok(st)
if result is not None:
for k, v in result.items():
setattr(obj, k, v)
uob = UpdateableObject()
# Passed None because the `check_ok` functions doesn't use the `st` parameter
check_and_update(uob, None)
# {'prop_1': 'x', 'prop_2': 'y'}
print(f'{uob.__dict__}')
答案 1 :(得分:1)
让我解释一下句子“ NB:该对象来自类,不能修改其类。” 含义:您不能修改该类的代码,但修改实例属性即可。
然后,您可以使用attr1: value
attr2: value
interfaces:
[
{'interface_number': 1, 'ip': 1.2.3.4, test:test2},
{'interface_number': 2, 'ip': 2.3.4.5, test:test3},
.
.
.
]
修改对象:
setattr
此外,实现尽早停止/退出可能是一个好主意,这取决于您的代码有多长时间(并取决于在这种情况下要执行的操作)。由于“阅读器”不等待/寻找def check_and_update(obj, st):
result = check_ok(st)
if result is not None:
for k, v in result.items():
setattr(obj, k, v)
或elif
子句,因此这消除了代码的一级缩进并使其更易于阅读代码:
else
如果出于某种原因该类的def check_and_update(obj, st):
result = check_ok(st)
if result is not None:
return # or whatever you want to do here
for k, v in result.items():
setattr(obj, k, v)
实际上是不可变的,则您始终可以尝试从该类继承并覆盖关键部分:
obj