Поддерживает ли оператор with указание типа? - PullRequest
16 голосов
/ 11 февраля 2020

Можете ли вы определить подсказку типа для переменной, определенной с синтаксисом with?

with example() as x:
    print(x)

Я хотел бы напечатать подсказку выше, чтобы сказать, что x является str (как пример).

Единственное, что я нашел, - это использование промежуточной переменной, но это выглядит как хакерство.

with example() as x:
    y: str = x
    print(y)

Я не могу найти пример в печатная документация .

Ответы [ 2 ]

14 голосов
/ 11 февраля 2020

Обычно аннотации типов размещаются на границах API. В этом случае тип должен быть выведен из example.__enter__. Если эта функция не объявляет какие-либо типы, решение состоит в том, чтобы создать соответствующий файл-заглушку , чтобы средство проверки типов могло вывести этот тип.

В частности, это означает создание .pyi файл с тем же основанием, что и модуль, из которого Example был импортирован. Затем можно добавить следующий код:

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
11 голосов
/ 11 февраля 2020

PEP 526, реализованный в Python 3.6, позволяет комментировать переменные. Вы можете использовать, например,

x: str
with example() as x:
    [...]

или

with example() as x:
    x: str
    [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...