[英]Python AWS boto3 returning NoneType Error
我正在尝试使用 boto3 Python 模块在 AWS 账户中枚举一些 EC2 实例详细信息,但我不断收到意外错误。 具体来说,我正在尝试获取与每个实例关联的标签。 这是我的代码的粗略副本:
#!/usr/bin/python3
import boto3
import botocore
boto3_session = create_boto3_session(profile_name='some_profile')
ec2_resource = boto3_session.resource("ec2", region_name='some_region')
ec2_instances = ec2_resource.instances.all()
for ec2_instance in ec2_instances:
tags = getattr(ec2_instance, 'tags', [])
for tag in tags:
print(tag)
当代码运行时,它会按预期打印实例的标签 - 直到找到没有标签的实例,然后我收到错误:
for tag in tags:
TypeError: 'NoneType' object is not iterable
我不明白为什么 getattr() function 返回一个“NoneType”,而不是像我要求的那样返回一个空列表。 我错过了什么吗?
我想我找到了答案。 它不是特定于 boto3 的。
当您在 object 上调用getattr()
时,如果 class 没有实现__getattr__()
方法,它似乎只返回一个提供的默认值。 如果它确实具有该方法,那么它将返回__getattr__()
中指定的值,无论如何。
在 object 上调用hasattr()
似乎也是如此。 如果实现了该方法,它将返回__getattr__()
中指定的值。 这有点违反直觉,因为如果__getattr__()
方法设置为返回False
,那么为不存在的属性调用hasattr()
将返回True
。
像这样的东西会起作用吗? 我所有的实例都有标签,但我认为如果不存在标签,你会得到一个空列表,所以如果弹出错误,你可能需要检查长度。
for ec2_instance in ec2_instances:
for tag in ec2_instance.tags:
print(tag)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.