Введіть натяк на список вказаного типу


128

Використовуючи анотації функцій Python 3, можна вказати тип елементів, що містяться в однорідному списку (або іншій колекції) з метою натяку на тип в PyCharm та інших IDE?

Приклад псевдопітонного коду для списку int:

def my_func(l:list<int>):
    pass

Я знаю, що це можливо за допомогою Docstring ...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

... але я віддаю перевагу стилю анотації, якщо це можливо.


Ви намагалися використовувати той самий формат в анотаціях до функцій? Що трапилось?
jonrsharpe

@jonrsharpe Це повинно викликати помилку, оскільки type object is not subscriptableпри визначенні функції. Очевидно, ви можете використовувати рядок: def my_func(L: 'list[int]')але я не знаю, чи PyCharm буде розбирати його, коли він розбирає документи ...
Bakuriu

@ Bakuriu так, я мав на увазі 'list[int]', вибачтесь, якщо це було не ясно.
jonrsharpe

Не здається, що PyCharm розбере його так, як це робить docstrings.
Ерік В.

Відповіді:


161

Відповідаючи на власне запитання; відповідь TLDR - ні Так .

Оновлення 2

У вересні 2015 року вийшов Python 3.5 з підтримкою Type Hints і включає новий модуль для набору тексту . Це дозволяє специфікувати типи, що містяться в колекціях. Станом на листопад 2015 року JetBrains PyCharm 5.0 повністю підтримує Python 3.5 для включення підказок типу, як показано нижче.

Завершення коду PyCharm 5.0 за допомогою підказки типу

Оновлення 1

Станом на травень 2015 року PEP0484 (Тип підказки) офіційно прийнято. Проект реалізації також доступний на веб-сайті github під amv / typehinting .

Оригінальний відповідь

З серпня 2014 року я підтвердив, що не можна використовувати анотації типу Python 3 для вказівки типів у колекціях (наприклад: список рядків).

Використання відформатованих документів, таких як reStructuredText або Sphinx, є життєздатними альтернативами та підтримується різними IDE.

Також видається, що Гвідо роздумує над ідеєю розширення анотацій типу в дусі mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Оновлення: Схоже, натяк на тип для включення підтримки для загальних типів пробився до PEP484 python.org/dev/peps/pep-0484
Eric W.

74

Тепер, коли Python 3.5 офіційно вийшов, є підтримуючий модуль Type Hints - typingі відповідний List"тип" для загальних контейнерів.

Іншими словами, тепер ви можете робити:

from typing import List

def my_func(l: List[int]):
    pass

10

Коментарі типу додано з PEP 484

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

Наразі це працює для мене на PyCharm з Python 3.6.4

Приклад зображення в Pycharm


4

За підтримки BDFL зараз майже впевнено, що python (ймовірно, 3,5) надасть стандартизований синтаксис для підказів типу через анотації функцій.

https://www.python.org/dev/peps/pep-0484/

Як згадується в PEP, існує експериментальна перевірка типу (на зразок pylint, але для типів) під назвою mypy, яка вже використовує цей стандарт, і не вимагає жодного нового синтаксису.

http://mypy-lang.org/


3

Як і в Python 3.9, вбудовані типи є загальними щодо анотацій типів (див. PEP 585 ). Це дозволяє безпосередньо вказати тип елементів:

def my_func(l: list[int]):
    pass

Різні інструменти можуть підтримувати цей синтаксис раніше, ніж Python 3.9. Коли анотації не перевіряються під час виконання, синтаксис є дійсним за допомогою цитування або __future__.annotations.

# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.