type()函数不会为boto3 sqs对象返回正确的结果?

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返回这个不存在的类?
  • 我怎样才能找到这个对象的正确类型?

Nik*_*ann 5

的类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)

  • 您可以执行“队列:boto3.resources.base.ServiceResource” (3认同)