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

时间:2017-03-30 21:24:59

标签: python boto boto3 type-hinting 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'>

我写这样的类型提示功能:

def get_session() -> boto3.resources.factory.sqs.Queue:
    ...

但是我收到了一个错误:

AttributeError: module 'boto3.resources.factory' has no attribute 'sqs'

我自己使用dir(...)查看了包裹。事实上factory似乎并不包含sqs。因此,我有两个问题:

  • 为什么type会返回此不存在的类?
  • 如何找到此对象的正确类型?

1 个答案:

答案 0 :(得分:4)

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

所以这在博托的结尾是一个糟糕的设计选择。我认为这意味着即使使用前向引用也无法合理地对其进行注释。

最好的办法是为所有这些动态类boto3.resources.base.ServiceResource的公共基类提供类型提示:

>>> type(q).__bases__
(<class 'boto3.resources.base.ServiceResource'>,)