Boto3资源(如DynamoDB.Table)的类型注释

vil*_*asv 5 python amazon-web-services python-3.x aws-sdk boto3

boto3库提供了几种返回资源的工厂方法。例如:

dynamo = (
    boto3
    .resource('dynamodb')
    .Table(os.environ['DYNAMODB_TABLE'])
)
Run Code Online (Sandbox Code Playgroud)

我想注释这些资源,以便可以更好地进行类型检查和完成,但是唯一可以找到的类型是from boto3.dynamodb.table import TableResource

当我添加该注释时:

dynamo: TableResource = (
    boto3
    .resource('dynamodb')
    .Table(os.environ['DYNAMODB_TABLE'])
)
Run Code Online (Sandbox Code Playgroud)

batch_writer(self, overwrite_by_pkeys)即使文档列出了其他几种,自动补全提供的唯一方法也是。

这是用作注释的错误类吗?在终端中检查该变量类型,我可以看到它是<class 'boto3.resources.factory.dynamodb.Table'>,但似乎不可能静态获得该类型。

And*_*kin 10

可以在此库的帮助下输入使用 DynamoDB 的注释代码: https: //github.com/vemel/mypy_boto3

安装:

pip install boto3-stubs[dynamodb]
Run Code Online (Sandbox Code Playgroud)

用法:

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")
Run Code Online (Sandbox Code Playgroud)

还可以注释许多其他 boto3 服务,请参阅该库的 GitHub 页面。


El *_*uso 6

除了 Alex Hall 的回答。 前向引用可以用来解决这个问题。

dynamo: 'boto3.resources.factory.dynamodb.Table' = (
    boto3
    .resource('dynamodb')
    .Table(os.environ['DYNAMODB_TABLE']))
Run Code Online (Sandbox Code Playgroud)


Ale*_*all 5

类型和API方法不是静态存在的。boto3使用数据驱动的体系结构,这是一种非常动态的设计,它使用JSON格式的数据(此处是示例)来确定可以进行哪些API调用。他们这样做是为了轻松地更新库以包括新的API更改。我不确定,但我认为他们可能会对其他语言的SDK使用相同的策略,因此只需很少的重复工作即可对多个SDK进行更改。

这是他们博客的引文:

图书馆必须适应用户需求的变化,还必须适应用户运行平台的变化。随着AWS多年来的增长加速,我们API的更新速度也越来越快。这就要求我们设计一种可扩展的方法,以每周快速提供对多个API更新的支持,这就是为什么Boto3中的AWS API支持几乎完全由数据驱动的原因。Boto3具有“客户端”类,这些类由描述AWS API的JSON格式的API模型驱动,因此大多数新服务功能仅需要简单的模型更新。这使我们能够以一致且可靠的方式非常快速地提供对API更改的支持。

您还可以通过进入诸如resource.Table调试器之类的方法调用来了解这种情况。