Чи натякає на підтримку оператора «з»?


16

Чи можете ви визначити підказку типу для змінної, визначеної withсинтаксисом?

with example() as x:
    print(x)

Я хотів би набрати підказку вище, сказати, що xце str(як приклад).

Єдина робота, яку я знайшов, - це використання проміжної змінної, але це відчувається хакі.

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

Я не можу знайти приклад у друкарській документації .


6
Чи не повинні перевіряючі типи мати можливість виводити тип xяк тип повернення example().__enter__()?
pschill

2
Чому ви хочете коментувати, xколи це просто тип повернення example.__enter__? В ідеалі ви вказали цей метод / функцію.
a_guest

1
xне повернене значення example; це повернене значення example().__enter__().
чепнер

Більшість знайдених нами методів не визначають підказку типу для значення, що повертається.
Реакційний

1
@Reactgular Тоді рішення - створити файл заглушки для цієї функції, щоб перевіряючий тип міг зробити висновок про тип. Зазвичай ви коментуєте на межах API, а не всередині. У цьому випадку зрозуміло, звідки походить example. Анотування example.__enter__означає одне примітку, тоді як при вашому підході вам доведеться коментувати в усіх місцях, де використовується цей менеджер контексту, а також взагалі, як користувач повинен знати, що таке тип повернення API, якщо він не надається?
a_guest

Відповіді:


11

PEP 526, який був реалізований в Python 3.6, дозволяє коментувати змінні. Ви можете використовувати, наприклад,

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

або

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

Це також працює для інших кодових блоків, таких як for. Чудова відповідь, дякую.
Реакційний

Якщо менеджер контексту не натякає, що __enter__метод повернеться, введення тексту xне служить ніякій меті. mypyрадісно дозволить прив’язати значення будь-якого типу x.
чепнер

@chepner Так, ви праві. PyCharm розпізнає xяк strв обох випадках, але mypyні.
pschill

14

Зазвичай типові примітки розміщуються на межах API. У цьому випадку слід зробити висновок про тип example.__enter__. У випадку, якщо ця функція не оголошує жодних типів, рішенням є створення відповідного файла заглушки , щоб допомогти перевіряючому типу зробити висновок про цей тип.

Зокрема це означає створення .pyiфайлу з тим же стовбуром, що і модуль, з якого Exampleбуло імпортовано. Тоді можна додати наступний код:

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.