type() 函数不 return 正确的 boto3 sqs 对象结果?
type() function doesn't return correct result for a boto3 sqs object?
我正在使用 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
返回这个不存在的 class?
- 如何找到此对象的正确类型?
sqs.Queue
的 class 每次调用时似乎都是即时生成的:
>>> 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
所以这对 boto 来说是一个糟糕的设计选择。我认为这意味着不可能合理地键入注释它,即使有前向引用。
最好的办法是为所有这些动态 class 的公共基础 class 提供类型提示,boto3.resources.base.ServiceResource
:
>>> type(q).__bases__
(<class 'boto3.resources.base.ServiceResource'>,)
我正在使用 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
返回这个不存在的 class? - 如何找到此对象的正确类型?
sqs.Queue
的 class 每次调用时似乎都是即时生成的:
>>> 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
所以这对 boto 来说是一个糟糕的设计选择。我认为这意味着不可能合理地键入注释它,即使有前向引用。
最好的办法是为所有这些动态 class 的公共基础 class 提供类型提示,boto3.resources.base.ServiceResource
:
>>> type(q).__bases__
(<class 'boto3.resources.base.ServiceResource'>,)