为DynamoDB.Table等boto3资源键入注释

时间:2018-03-29 19:10:24

标签: python python-3.x amazon-web-services aws-sdk boto3

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'>,但似乎无法静态获取该类型。

3 个答案:

答案 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']))