2010-09-29 84 views
2

我有一个lxml.objectify数据结构,我从RESTful Web服务获得。如果存在,我需要更改设置,如果不存在,则创建它。现在我有以下几条线,但我觉得它很丑。我正在查看的结构中有一个子元素列表,它们都具有相同的结构,所以我不能不幸找到特定的标记。如何更好地构建此代码?

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

总体来说,结构是不是太糟糕了(假设你需要在设置呼叫modify1+项目 - 如果“只是一个”,即如果is_what_I_want标志将是最多设置一个设置,这当然是不同的,因为你可以并且应该使用for循环中的break--但这不是我从你Q获得的意图的印象,请澄清一下,如果我错了!) 。还有一个冗余:

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的分配。 (顺便说一句,foo以外的名字不会伤害;-)。

+0

的'foo'名称是不是我在实际的代码中使用,我只是想降低复杂一点,并没有把具体的事情我的代码库 - 更多的一般结构。我其实重新绑定了这个项目,这就是为什么我使用'i'。 – Daenyth 2010-09-29 17:50:26

+0

@Daenyth,'foo'非常明显(这就是为什么我在那里有笑脸的原因),但是消除项目重组的重要不同操作是过于简单化 - 无论您是否在进行重新绑定(因此需要枚举)或不要(因此不需要它)。随着你的新信息,并始终假设你需要能够调用**修改一次或多次**(不只是一次),我不能看到大量的简化(一些技巧,是的,但它们可能会损坏清晰度而不是增强)。 – 2010-09-29 20:53:10

+0

亚历克斯,你可以看看这个当你有机会:http://stackoverflow.com/questions/3826473/boolean-operations-in-python-ie-the-and-or-operators?谢谢 – NullUserException 2010-09-29 22:54:11

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