如何测试可能不存在的属性? [复制]
Posted
技术标签:
【中文标题】如何测试可能不存在的属性? [复制]【英文标题】:How to test attribute that might not be present? [duplicate] 【发布时间】:2021-09-02 07:30:46 【问题描述】:这是从 YAML 文件生成文档的脚本的一部分。它不会走得很远。
for yaml_filename in yaml_files:
with open(yaml_filename, 'r') as yaml_file:
try:
yaml_contents = yaml.safe_load(yaml_file)
for api_name in yaml_contents:
api = yaml_contents[api_name]
if 'api_doc' in api.keys(): # <---- error generated here
format_api(api_name, api, html_file)
else:
# Handle the generation of HTML documentation for APIs
# that have not been updated to include the api_doc
# object.
我得到的初始错误是这样的:
AttributeError: 'str' object has no attribute 'keys'
我最初的解释是,如果api
缺少keys
属性,那么我可以更正if
测试来处理它,并且仍然可以到达else
分支并正确解析文件。所以我尝试的修复看起来像这样:
if hasattr(api,keys) and 'api_doc' in api.keys():
但是现在生成的错误信息是:
NameError: name 'keys' is not defined
我认为hasattr()
测试只会返回 false,但它会引发错误。我在这里对python对象的理解已经到了极限,我不知道如何搜索我不知道的东西。到底是怎么回事?剧本一直都好吗?是yaml.safe_load()
失败的问题吗?还是api
格式不正确?
【问题讨论】:
hasattr
的第二个参数应该是一个字符串,像这样:if hasattr(api, 'keys')
是的,@oskros,这本质上是重复的。不过,我可能没有发现引号,我非常感谢大家耐心指出我的错误。
【参考方案1】:
您必须将属性名称指定为字符串,而不是标识符:
if hasattr(api, "keys") and ...:
【讨论】:
以上是关于如何测试可能不存在的属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章