New*_*ewb 5 python type-hinting boto boto3 mypy
我正在使用Python 3的类型提示语法,我正在编写一个使用SQS的小型AWS应用程序.我试图提示队列的类型.这是我获取队列类型的方式:
>>> import boto3
>>> session = boto3.session.Session(
>>> aws_access_key_id=AWS_ACCESS_KEY,
>>> aws_secret_access_key=AWS_SECRET_KEY,
>>> region_name='us-west-2'
>>> )
>>> sqs = session.resource('sqs')
>>> queue=sqs.Queue(AWS_QUEUE_URL)
>>>
>>> type(queue)
<class 'boto3.resources.factory.sqs.Queue'>
Run Code Online (Sandbox Code Playgroud)
我写这样的类型提示功能:
def get_session() -> boto3.resources.factory.sqs.Queue:
...
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
AttributeError: module 'boto3.resources.factory' has no attribute 'sqs'
Run Code Online (Sandbox Code Playgroud)
我亲自看过包装dir(...).事实上似乎factory并不包含sqs.因此,我有两个问题:
type返回这个不存在的类?的类sqs.Queue似乎是在每次调用时即时生成的:
>>> import boto3
>>> session = boto3.session.Session(aws_access_key_id='foo', aws_secret_access_key='bar', region_name='us-west-2')
>>> sqs = session.resource('sqs')
>>> sqs.Queue
<bound method sqs.ServiceResource.Queue of sqs.ServiceResource()>
>>> q = sqs.Queue('blah')
>>> type(q)
<class 'boto3.resources.factory.sqs.Queue'>
>>> q2 = sqs.Queue('bluh')
>>> type(q) == type(q2)
False
Run Code Online (Sandbox Code Playgroud)
所以这对于 boto 来说是一个糟糕的设计选择。我认为这意味着即使有前向引用,也不可能合理地对其进行键入注释。
最好的选择是为所有这些动态类的公共基类提供类型提示boto3.resources.base.ServiceResource:
>>> type(q).__bases__
(<class 'boto3.resources.base.ServiceResource'>,)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |