Добавление подсказок к функциям, которые возвращают объекты boto3? - PullRequest
0 голосов
/ 30 августа 2018

Как мне добавить подсказки к моим функциям, которые возвращают различные ресурсы boto3? Я хотел бы получить автоматическое завершение / проверку моих возвращаемых значений в IDE, таких как PyCharm. Boto3 делает магию создания фабрики, поэтому я не могу понять, как правильно объявлять типы

import boto3 ec2 = boto3.Session().resource('ec2') a = ec2.Image('asdf') a.__class__ # => boto3.resources.factory.ec2.Image

Но boto3.resources.factory.ec2.Image не является классом, который распознается Python. Поэтому я не могу использовать его для подсказки типа.

Документы показывают, что тип возвращаемого значения EC2.Image. Но есть ли способ импортировать этот тип как обычный тип Python?

1 Ответ

0 голосов
/ 13 февраля 2019

Я сделал пакет, который может помочь с этим, boto3_type_annotations. Он также доступен с документацией или без нее. Пример использования ниже. На моем github также есть gif, показывающий его в действии с помощью PyCharm.

import boto3
from boto3_type_annotations.s3 import Client, ServiceResource
from boto3_type_annotations.s3.waiter import BucketExists
from boto3_type_annotations.s3.paginator import ListObjectsV2

# With type annotations

client: Client = boto3.client('s3')
client.create_bucket(Bucket='foo')  # Not only does your IDE knows the name of this method, 
                                    # it knows the type of the `Bucket` argument too!
                                    # It also, knows that `Bucket` is required, but `ACL` isn't!

# Waiters and paginators and defined also...

waiter: BucketExists = client.get_waiter('bucket_exists')
waiter.wait('foo')

paginator: ListObjectsV2 = client.get_paginator('list_objects_v2')
response = paginator.paginate(Bucket='foo')

# Along with service resources.

resource: ServiceResource = boto3.resource('s3')
bucket = resource.Bucket('bar')
bucket.create()

# With type comments

client = boto3.client('s3')  # type: Client
response = client.get_object(Bucket='foo', Key='bar')


# In docstrings

class Foo:
    def __init__(self, client):
        """
        :param client: It's an S3 Client and the IDE is gonna know what it is!
        :type client: Client
        """
        self.client = client

    def bar(self):
        """
        :rtype: Client
        """
        self.client.delete_object(Bucket='foo', Key='bar')
        return self.client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...