Типовая подсказка для списка указанного типа

130

Используя аннотации функций Python 3, можно указать тип элементов, содержащихся в однородном списке (или другой коллекции), с целью указания типов в PyCharm и других IDE?

Пример кода псевдо-Python для списка 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 Да, я имел в виду 'list[int]', извиняюсь, если это не ясно.
jonrsharpe
Не похоже, что PyCharm будет анализировать его, как строки документации.
Eric W.

Ответы:

161

Отвечая на свой вопрос; ответ TLDR - Нет Да .

Обновление 2

В сентябре 2015 года был выпущен Python 3.5 с поддержкой Type Hints и новым модулем набора текста . Это позволяет специфицировать типы, содержащиеся в коллекциях. По состоянию на ноябрь 2015 года JetBrains PyCharm 5.0 полностью поддерживает Python 3.5, включая подсказки типов, как показано ниже.

Завершение кода PyCharm 5.0 с использованием подсказок типов

Обновление 1

По состоянию на май 2015 года PEP0484 (Типовые подсказки) был официально принят. Черновик реализации также доступен на github в разделе ambv / 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.
75

Теперь, когда Python 3.5 официально выпущен, есть модуль поддержки Type Hints typingи соответствующий List«тип» для общих контейнеров.

Другими словами, теперь вы можете:

from typing import List

def my_func(l: List[int]):
    pass
alecxe
источник
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

CoreCreatives
источник
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
MisterMiyagi
источник