我从RESTful Web服务获得了lxml.objectify
数据结构。我需要更改设置(如果存在)并创建它(如果不存在)。现在我有以下几点,但我觉得它很难看。我正在寻找的结构有一个子元素列表,它们都具有相同的结构,所以不幸的是我不能只寻找一个特定的标签。
thing_structure = lxml.objectify(get_from_REST_service())
found_thing = False
if thing_structure.find('settings') is not None:
for i, foo in enumerate(thing_structure.settings):
if foo.is_what_I_want:
modify(thing_structure.settings[i])
found_thing = True
if not found_thing:
new = lxml.etree.SubElement(thing_structure, 'setting')
modify(new)
send_to_REST_service(thing_structure)
答案 0 :(得分:2)
总体而言,结构并不太糟糕(假设您需要在设置中的 1 + 项目上调用modify
- 如果“只有一个”,即{ {1}}标记最多会设置为一个设置,这当然是不同的,因为您可以并且应该使用is_what_I_want
循环中的break
- 但这不是您的印象我从你的Q中获得的意图,请澄清我是否有mistead!)。有一个冗余:
for
使用for i, foo in enumerate(thing_structure.settings):
if foo.is_what_I_want:
modify(thing_structure.settings[i])
found_thing = True
并使用它再次获取相同的i
在此处没有用,所以您可以简化为:
foo
如果您要重新绑定项目,则只需要索引,即执行for foo in thing_structure.settings:
if foo.is_what_I_want:
modify(foo)
found_thing = True
之类的作业。 (顺便说一句,thing_structure.settings = whatever
以外的名字不会受到伤害; - )。
答案 1 :(得分:0)
我会这样写:
thing_structure = lxml.objectify(get_from_REST_service())
if thing_structure.find('settings') is not None:
foos = [foo for foo in thing_structure.settings if foo.is_what_I_want]
or [lxml.etree.SubElement(thing_structure, 'setting')]
for foo in foos:
modify(foo)
send_to_REST_service(thing_structure)
我不关心is not None
并尽可能消除它。我可以在这里写道:
if thing_structure.find('settings'):