Was sind variable Anmerkungen?
Variable Anmerkungen sind nur der nächste Schritt von # type
Kommentaren, 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 typing
und 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]}
captain
wird derzeit nicht angezeigt, get_type_hints
da get_type_hints
nur 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 ChainMap
verwendet 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 mro
Zuordnung gefunden wurden (nachfolgende Zuordnungen {}
für Objekt).
Zusammen mit der neuen Syntax wurde ein neuer ClassVar
Typ hinzugefügt, um Klassenvariablen zu kennzeichnen. Ja, stats
in 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 484
sind 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 , dassprimes
soll dich auf nur enthaltenint
s 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.