Преобразование XML в объект Python - несколько операторов IF - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать собственную логику для анализа строки XML и преобразования ее в объект Python. Это требует от меня сделать кучу

attribute1 = xml_element.find('ATTRIBUTE1')
attribute2 = xml_element.find('ATTRIBUTE2')

А потом несколько:

if attribute1 is not None:
    obj.attribute1 = attribute1.text
if attribute2 is not None:
    obj.attribute2 = attribute2.text

Эти множественные операторы if (их почти 50) приводят к тому, что 4D показывает низкий охват тестами (очевидно, я не проверяю каждый оператор if), а также говорю, что моя функция имеет высокую когнитивную сложность. Хотите знать, если есть способ сделать это без нескольких операторов if? (Сторонние пакеты не являются опцией)

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать метод, чтобы проверить, является ли объект None

@staticmethod
def assign_attribute(attribute):
    if attribute is not None:
        return attribute.text
    return None

А затем просто вызовите его и назначьте текст или None, если атрибут равен нулю:

obj.attribute1 = assign_attribute(attribute1)
obj.attribute2 = assign_attribute(attribute2)

Теперь у вас есть только один оператор "если".

Редактировать

В этом коде предполагается, что вы впервые создаете и инициализируете объект из XML-файла, если obj.attribute1 уже содержит значение, а затем вы используете метод assign_attribute, а атрибут равен None, исходное значение будет очиститься.

Если вы хотите сохранить существующие значения, метод может выглядеть примерно так:

@staticmethod
def assign_attribute(xml, attribute_name, current_value):
    attribute = xml.find(attribute_name)
    if attribute is not None:
        return attribute.text
    elif current_value is not None:
        return current_value
    else
        return None

obj.attribute1 = assign_attribute(xml_element, 'ATTRIBUTE1', obj.attribute1)
obj.attribute2 = assign_attribute(xml_element, 'ATTRIBUTE2', obj.attribute2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...