python - 将 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 语句的情况下做到这一点?(第三方包不是一个选项)
解决方案
您可以使用一种方法来检查对象是否是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)
推荐阅读
- html - 以移动尺寸格式查看时,未显示 div 元素,并且页脚位于未显示的 div 上方
- wordpress - 在 Wordpress 中嵌套简码(简单)
- flutter - 如何在 Lists Flutter 中添加分隔符
- amazon-web-services - AWS Lambda 发布 SNS
- c++ - C++:旧 C 风格的字符串数组问题(如 Char**)
- shell - shell:如何递归地复制具有特殊字符的文件名
- typescript - 在输入三重指令之前找不到 tsconfig.json 中的类型定义 ///
我有这个
tsconfig.json
:{ "extends": "@tsconfig/svelte/tsconfig.json", "include": [ "src/**/*" ], "types": [ "jest", "gapi", "gapi.au
- html - 如何从最后一个元素开始新的 div?
- c++ - 在 Win32 桌面应用程序上创建按钮时出错
- c++ - 我是否需要删除 std::localtime 返回的指针?