Как я могу лучше структурировать этот код? - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть lxml.objectify структура данных, которую я получаю от веб-службы RESTful. Мне нужно изменить настройку, если она существует, и создать ее, если ее нет. Прямо сейчас у меня есть что-то вроде следующего, но я чувствую, что это уродливо. В структуре, которую я просматриваю, есть список подэлементов, которые имеют одинаковую структуру, поэтому я не могу просто найти определенный тег, к сожалению.

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 ]

2 голосов
/ 29 сентября 2010

В целом, структура не так уж плоха (при условии, что вам нужно вызвать modify на 1 + элементах в настройках - если «только один», т. Е. Если флаг is_what_I_wantбудет установлен максимум на один параметр, который, конечно, отличается, так как вы можете и должны использовать break из цикла for - но это не то впечатление о ваших намерениях, которое я получаю от вашего 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

You 'Индекс понадобился бы только в том случае, если вы повторно связали элемент, т.е. выполнили присваивание, например thing_structure.settings = whatever.(Кстати, имя, отличное от foo, не повредит; -).

0 голосов
/ 21 октября 2010

Я бы написал так:

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