![](/img/trans.png)
[英]How to create set (as value to dict) or add element in case set exists?
[英]How to set a var if it exists in a dict?
我正在查询带事件信息的API端点。 但是,有关每个事件的属性数量可以有所不同。 我现在尝试执行以下操作:
for e in apiResult:
event = Event()
event.street = e['f_street']
event.price = e['f_price']
event.venue_name = e['f_venue_name']
event.start = e['f_start']
# and about 40 more..
event.save()
但是我偶尔会遇到关键错误。 因此,对于每个属性,我需要检查它是否存在。 我当然可以这样做,如下所示:
if 'f_street' in e:
event.street = e['f_street']
if 'f_price' in e:
event.price = e['f_price']
# etc. etc.
但这似乎不是Python风格的。 有人知道我如何才能(Python)将属性设置为event
,只要它存在于e
词典中? 欢迎所有提示!
我建议使用属性列表,并使用if进行循环。 像这样:
attrs = ['f_street', 'f_price', 'etc']
...
for e in apiResult:
event = Event()
for attr in attrs:
if attr in e:
setattr(event, attr, e[attr])
event.save()
这还将消除40行属性设置。
顺便说一句,关于Python内置setattr
文档https://docs.python.org/2/library/functions.html#setattr
dict.get
将帮助:
Help on built-in function get:
get(...) method of builtins.dict instance
D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
所以你可以这样写:
# instead of this:
# event.start = e['f_start']
event.start = e.get('f_start') # And it would be None if key not exists
您可以为其编写一个函数:
def set_if_present(obj, attr_name, dictionary, key):
if key in dictionary:
setattr(obj, attr_name, dictionary[key])
比您可以像这样使用它:
>>> class O(object):
... pass
...
>>> d = {"a": 0, "b": 1}
>>> o = O()
>>> set_if_present(o, "a", d, "a")
>>> set_if_present(o, "b", d, "b")
>>> set_if_present(o, "c", d, "c")
>>> o.a
0
>>> o.b
1
>>> o.c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'O' object has no attribute 'c'
>>>
还是你的情况
for e in apiResult:
event = Event()
set_if_present(event, 'street', e, 'f_street')
set_if_present(event, 'price', e, 'f_price')
set_if_present(event, 'venue_name', e, 'f_venue_name')
set_if_present(event, 'start', e, 'f_start')
# and about 40 more..
event.save()
要变得更加蟒蛇,您可以创建一个成对的列表,例如[('street', 'f_street'), ('price', 'f_price')...]
,然后使用这些对进行获取和设置您的价值观。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.