如何测试可能不存在的属性? [复制]

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

【讨论】:

以上是关于如何测试可能不存在的属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中,如何测试/获取/设置可能存在或不存在的注册表项?

我的查询需要啥,可能不存在或不存在? [复制]

如何检查python中是不是存在文件? [复制]

在 Python 嵌套中添加目录的可能性? [复制]

添加到可能存在也可能不存在的 json 属性

在Python中删除可能存在或不存在的字典属性[重复]