boto3
库提供了几种返回资源的工厂方法。例如:
dynamo = (
boto3
.resource('dynamodb')
.Table(os.environ['DYNAMODB_TABLE'])
)
我想对这些资源进行注释,以便我可以更好地进行类型检查和完成,但我能找到的唯一类型是from boto3.dynamodb.table import TableResource
。
当我添加该注释时:
dynamo: TableResource = (
boto3
.resource('dynamodb')
.Table(os.environ['DYNAMODB_TABLE'])
)
自动完成功能提供的唯一方法是batch_writer(self, overwrite_by_pkeys)
,即使是文档lists several others。
这是用作注释的错误类吗?检查终端中的变量类型我可以看到它是<class 'boto3.resources.factory.dynamodb.Table'>
,但似乎无法静态获取该类型。
答案 0 :(得分:5)
类型和API方法不是静态存在的。 boto3使用数据驱动架构,这是一种极其动态的设计,它使用JSON格式的数据(here为例)来确定可能的API调用。他们这样做是为了便于更新库以包含新的API更改。我不确定,但我认为他们可能会在其他语言中使用相同的SDK策略,因此可以在几乎没有重复工作的情况下对多个SDK进行更改。
Here's a quote from their blog:
图书馆必须适应用户需求的变化以及他们运行的平台的变化。随着AWS多年来的增长,我们更新API的速度也变得更快。这要求我们设计一种可扩展的方法,以便每周快速提供对多个API更新的支持,这就是为什么Boto3中的AWS API支持几乎完全由数据驱动的原因。 Boto3具有由描述AWS API的JSON格式API模型驱动的“客户端”类,因此大多数新服务功能仅需要简单的模型更新。这使我们能够以一致和可靠的方式快速提供对API更改的支持。
您还可以通过调试器中的resource.Table
等方法调用来了解这种情况。
答案 1 :(得分:1)
可以在以下库的帮助下键入使用DynamoDB的注释代码:https://github.com/vemel/mypy_boto3。
安装:
pip install boto3-stubs[dynamodb]
用法:
from mypy_boto3_dynamodb import ServiceResource
dynamodb: ServiceResource = boto3.resource(
"dynamodb", region_name=region
)
# now type checker or IDE can infer type of `table`
# and find its methods
table = dynamodb.Table("example")
还可以注释许多其他boto3服务,请参见库的GitHub页面。
答案 2 :(得分:0)
除了Alex Hall回答。 Forward references可用于解决此问题。
dynamo: 'boto3.resources.factory.dynamodb.Table' = (
boto3
.resource('dynamodb')
.Table(os.environ['DYNAMODB_TABLE']))