【问题标题】: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,这本质上是重复的。不过,我可能没有发现引号,我非常感谢大家耐心指出我的错误。

标签: python yaml


【解决方案1】:

您必须将属性名称指定为字符串,而不是标识符:

if hasattr(api, "keys") and ...:

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2011-02-01
    • 2015-04-02
    • 2018-04-19
    • 2011-07-27
    相关资源
    最近更新 更多