如何更好地构建此代码?

时间:2010-09-29 17:18:37

标签: python code-cleanup

我从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)

2 个答案:

答案 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'):