Digite sugerindo uma lista de um tipo especificado


128

Usando as anotações de função do Python 3, é possível especificar o tipo de itens contidos em uma lista homogênea (ou outra coleção) para fins de sugestão de tipo no PyCharm e outros IDEs?

Um exemplo de código pseudo-python para uma lista de int:

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

Eu sei que é possível usando Docstring ...

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

... mas eu prefiro o estilo de anotação, se possível.


Você já tentou usar o mesmo formato nas anotações de função? O que aconteceu?
jonrsharpe

@jonrsharpe Deve levantar um erro porque type object is not subscriptableao definir a função. Obviamente, você pode usar uma string: def my_func(L: 'list[int]')mas não sei se o PyCharm irá analisá-la enquanto analisa as docstrings ...
Bakuriu

@Bakuriu sim, eu quis dizer 'list[int]', desculpas se não ficou claro.
jonrsharpe de

Não parece que o PyCharm irá analisá-lo como faz com os docstrings.
Eric W.

Respostas:


161

Respondendo minha própria pergunta; a resposta do TLDR é Não Sim .

Atualização 2

Em setembro de 2015, Python 3.5 foi lançado com suporte para Type Hints e inclui um novo módulo de digitação . Isso permite a especificação dos tipos contidos nas coleções. Desde novembro de 2015, JetBrains PyCharm 5.0 oferece suporte total ao Python 3.5 para incluir dicas de tipo conforme ilustrado abaixo.

Completação de código PyCharm 5.0 usando dicas de tipo

Atualização 1

Em maio de 2015, PEP0484 (Dicas de tipo) foi formalmente aceito. O rascunho da implementação também está disponível no github em ambv / typehinting .

Resposta Original

Em agosto de 2014, confirmei que não é possível usar anotações de tipo Python 3 para especificar tipos dentro de coleções (ex: uma lista de strings).

O uso de docstrings formatados, como reStructuredText ou Sphinx, são alternativas viáveis ​​e suportadas por vários IDEs.

Parece também que Guido está refletindo sobre a ideia de estender as anotações de tipo no espírito de mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Atualização: Parece que a sugestão de tipo para incluir suporte para tipos genéricos chegou ao PEP484 python.org/dev/peps/pep-0484
Eric W.

74

Agora que o Python 3.5 foi lançado oficialmente, existe o módulo de suporte Type Hints - typingeList "tipo" para os contêineres genéricos.

Em outras palavras, agora você pode fazer:

from typing import List

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

10

Comentários de tipo foram adicionados desde 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()}]

Atualmente, isso está funcionando para mim no PyCharm com Python 3.6.4

Exemplo de imagem em Pycharm


4

Com o suporte do BDFL, é quase certo agora que o python (provavelmente 3.5) fornecerá uma sintaxe padronizada para dicas de tipo por meio de anotações de função.

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

Conforme referenciado no PEP, existe um verificador de tipo experimental (tipo pylint, mas para tipos) chamado mypy que já usa esse padrão e não requer nenhuma nova sintaxe.

http://mypy-lang.org/


3

A partir do Python 3.9, os tipos embutidos são genéricos em relação às anotações de tipo (consulte PEP 585 ). Isso permite especificar diretamente o tipo de elementos:

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

Várias ferramentas podem oferecer suporte a essa sintaxe anterior ao Python 3.9. Quando as anotações não são inspecionadas em tempo de execução, a sintaxe é válida usando aspas ou __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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.