Pull to refresh

Comments 9

Это не работает в Python 3.6.5 и выглядит не очень. Какие есть альтернативы?

До появления аннотаций — использовал rST-docstrings и абстрактные классы. В PyCharm (в т. ч. и CE) — они индексируются аналогично аннотациям. Вроде бы видел такое же поведение в Atom. Работает с модулями.

class _S3Client(abc.ABC):
    @abc.abstractmethod
    def create_bucket(self, Bucket):
        """
        Creates bucket
        
        :param Bucket: name
        :type Bucket: str

        :rtype object
        """
        raise NotImplemented

client = boto3.client("s3")  # type: _S3Client
# Тут и далее будут подсказки по _S3Client

Вот в чем проблема с boto3.


class S3Client:
   def Bucket(self, ...) -> Bucket: ...

class Bucket: ...

Тут метод клиента и класс называются абсолютно одинаково и такое в каждом первом клиенте. mypy справедливо считает что возвращаемый тип — это метод, а не класс. Я нашел решение с само-импортом модуля


import s3.client as self_scope # модуль импортирует сам себя

class S3Client:
   def Bucket(self, ...) -> self_scope.Bucket: ...

class Bucket: ...

Так все работает, но ранит чувства.

Спасибо большое. То есть, для примера выше должно быть что-то вроде


class Bucket: ...

_BucketClass = Bucket

class S3Client:
   def Bucket(self, ...) -> _BucketClass: ...
ИМХО
Вижу это так:
MYPY = False

if MYPY:
    _BucketClass = Bucket

class S3Client:
   def Bucket(self, ...) -> '_BucketClass': ...

Было бы неплохо сделать аналогичный пакет для botocore. Наверное это должно быть не очень сложно, раз изначально всё генерируется из его данных.

Нет, для botocore стабы можно написать только руками. Это гораздо проще, но затратно по времени. Плюс, при обновлении botocore нужно будет проверять, не устарели ли стабы, в то время как для boto3 засчет генерации, обновление может быть полностью автоматизированно.


Но да, в 95% случаев, в новом релизе botocore меняются только JSON-файлы с описанием сервисов, так что стабы останутся без изменений.

Sign up to leave a comment.

Articles