首页 > 解决方案 > 将 XML 转换为 Python 对象 - 多个 IF 语句

问题描述

我正在尝试编写自己的逻辑来解析 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 语句的情况下做到这一点?(第三方包不是一个选项)

标签: pythonif-statement

解决方案


您可以使用一种方法来检查对象是否是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)

现在你只有一个“if”语句。

编辑

此代码假设您是第一次从 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)

推荐阅读