Was sind variable Anmerkungen?
Variable Anmerkungen sind nur der nächste Schritt von # typeKommentaren, wie sie in definiert wurden PEP 484. Die Gründe für diese Änderung werden im jeweiligen Abschnitt von PEP 526 hervorgehoben .
Anstatt den Typ mit folgenden Hinweisen zu versehen:
primes = []
Es wurde eine neue Syntax eingeführt , mit der der Typ direkt mit einer Zuweisung des Formulars versehen werden kann:
primes: List[int] = []
Dies bezeichnet, wie @Martijn hervorhob, eine Liste von Ganzzahlen, indem die in verfügbaren Typen verwendet typingund in eine leere Liste initialisiert werden.
Welche Veränderungen bringt es?
Die erste eingeführte Änderung war eine neue Syntax , mit der Sie einen Namen mit einem Typ versehen können, entweder eigenständig nach dem :Zeichen oder optional mit Anmerkungen versehen und ihm gleichzeitig einen Wert zuweisen können:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
Also das fragliche Beispiel:
primes: List[int] = [ ]
Mit der neuen Syntax wurden auch zusätzliche Änderungen eingeführt. Module und Klassen haben jetzt ein __annotations__Attribut (wie es Funktionen seit PEP 3107 - Funktionsanmerkungen hatten ), an das die Typmetadaten angehängt sind:
from typing import get_type_hints
Nun __main__.__annotations__enthält die deklarierten Typen:
>>> from typing import List, get_type_hints
>>> primes: List[int] = []
>>> captain: str
>>> import __main__
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int]}
captainwird derzeit nicht angezeigt, get_type_hintsda get_type_hintsnur Typen zurückgegeben werden, auf die auch in einem Modul zugegriffen werden kann. dh es braucht zuerst einen Wert:
>>> captain = "Picard"
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int], 'captain': <class 'str'>}
Die Verwendung print(__annotations__)wird angezeigt, 'captain': <class 'str'>aber Sie sollten wirklich nicht __annotations__direkt darauf zugreifen .
Ebenso für Klassen:
>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
Wobei a ChainMapverwendet wird, um die Annotationen für eine bestimmte Klasse (in der ersten Zuordnung) und alle Annotationen abzurufen, die in den Basisklassen definiert sind, die in ihrer mroZuordnung gefunden wurden (nachfolgende Zuordnungen {}für Objekt).
Zusammen mit der neuen Syntax wurde ein neuer ClassVarTyp hinzugefügt, um Klassenvariablen zu kennzeichnen. Ja, statsin Ihrem Beispiel handelt es sich tatsächlich um eine Instanzvariable , nicht um eine ClassVar.
Werde ich gezwungen sein, es zu benutzen?
Wie bei Typhinweisen von PEP 484sind diese vollständig optional und werden hauptsächlich für Tools zur Typprüfung verwendet (und was auch immer Sie basierend auf diesen Informationen erstellen können). Es soll vorläufig sein, wenn die stabile Version von Python 3.6 veröffentlicht wird, damit in Zukunft möglicherweise kleine Änderungen hinzugefügt werden.
primes: List[int] = []ist nur eine leere Liste alsprimes = []. Der Unterschied ist , dass Sie behaupten , dassprimessoll dich auf nur enthaltenints und 3rd - Party - Anwendungen möglicherweise geben Sie Ihr Programm überprüfen , diese Behauptung zu überprüfen, aber wenn Sie den Code in jedem Python - Interpreter ausführen , die genau das gleiche wie das Schreiben istprimes = [], und so tun ,primes: List[int] = []; primes.append("string")ist nach wie vor gültig.