Geben Sie einen Hinweis auf eine Liste eines bestimmten Typs ein

127

Mithilfe der Funktionsanmerkungen von Python 3 ist es möglich, den Typ der Elemente anzugeben, die in einer homogenen Liste (oder einer anderen Sammlung) enthalten sind, um in PyCharm und anderen IDEs einen Hinweis auf den Typ zu geben.

Ein Pseudo-Python-Codebeispiel für eine Liste von int:

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

Ich weiß, dass es mit Docstring möglich ist ...

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

... aber ich bevorzuge den Anmerkungsstil, wenn es möglich ist.

Eric W.
quelle
Haben Sie versucht, dasselbe Format in den Funktionsanmerkungen zu verwenden? Was ist passiert?
Jonrsharpe
@jonrsharpe Es sollte einen Fehler auslösen, da type object is not subscriptablebei der Definition der Funktion. Natürlich können Sie einen String verwenden: def my_func(L: 'list[int]')aber ich weiß nicht, ob PyCharm ihn analysieren wird, während er die Docstrings analysiert ...
Bakuriu
@ Bakuriu ja, ich meinte 'list[int]', entschuldige mich , wenn das nicht klar war.
Jonrsharpe
Es scheint nicht, dass PyCharm es wie Docstrings analysiert.
Eric W.

Antworten:

160

Beantwortung meiner eigenen Frage; Die TLDR-Antwort lautet Nein Ja .

Update 2

Im September 2015 wurde Python 3.5 mit Unterstützung für Typ Hinweise veröffentlicht und enthält eine neue Eingabe - Modul . Dies ermöglicht die Angabe von Typen, die in Sammlungen enthalten sind. Ab November 2015 unterstützt JetBrains PyCharm 5.0 Python 3.5 vollständig und enthält Typhinweise, wie unten dargestellt.

PyCharm 5.0-Code-Vervollständigung mithilfe von Typhinweisen

Update 1

Ab Mai 2015 wurde PEP0484 (Type Hints) offiziell akzeptiert. Der Implementierungsentwurf ist auch bei github unter ambv / typehinting erhältlich .

Ursprüngliche Antwort

Ab August 2014 habe ich bestätigt, dass es nicht möglich ist, Python 3-Typanmerkungen zu verwenden, um Typen in Sammlungen anzugeben (z. B. eine Liste von Zeichenfolgen).

Die Verwendung formatierter Dokumentzeichenfolgen wie reStructuredText oder Sphinx ist eine praktikable Alternative und wird von verschiedenen IDEs unterstützt.

Es scheint auch, dass Guido über die Idee nachdenkt, Typanmerkungen im Geiste von mypy zu erweitern: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html

Eric W.
quelle
Update: Es scheint, dass der Typ, der auf die Unterstützung generischer Typen hinweist, den Weg zu PEP484 python.org/dev/peps/pep-0484
Eric W.
74

Nachdem Python 3.5 offiziell veröffentlicht wurde, gibt es das Type Hints-Unterstützungsmodul - typingund das entsprechendeList " "Typ" für die generischen Container.

Mit anderen Worten, jetzt können Sie Folgendes tun:

from typing import List

def my_func(l: List[int]):
    pass
Alecxe
quelle
10

Typkommentare wurden seit PEP 484 hinzugefügt

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()}]

Dies funktioniert derzeit für mich auf PyCharm mit Python 3.6.4

Beispielbild in Pycharm

CoreCreatives
quelle
4

Mit der Unterstützung der BDFL ist es jetzt fast sicher, dass Python (wahrscheinlich 3.5) eine standardisierte Syntax für Typhinweise über Funktionsanmerkungen bereitstellt.

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

Wie im PEP erwähnt, gibt es einen experimentellen Typprüfer (ähnlich wie Pylint, aber für Typen) namens mypy, der diesen Standard bereits verwendet und keine neue Syntax erfordert.

http://mypy-lang.org/

Brendan Abel
quelle
3

Ab Python 3.9 sind integrierte Typen in Bezug auf Typanmerkungen generisch (siehe PEP 585 ). Auf diese Weise können Sie den Elementtyp direkt angeben:

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

Verschiedene Tools unterstützen diese Syntax möglicherweise früher als Python 3.9. Wenn Anmerkungen zur Laufzeit nicht überprüft werden, ist die Syntax mit Anführungszeichen oder gültig __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
quelle