[PYTHON] Ich habe PEP 585 gelesen (Type Hinting Generics In Standard Collections)
Als ich untersuchte, woher das Attribut "origin" stammt, wurde ein PEP mit dem Namen PEP 585 - Typ mit Hinweisen auf Generika in Standardsammlungen verwendet. Ich habe es gefunden, also habe ich den ursprünglichen Zweck vergessen und es überflogen. Ich bin immer noch im Entwurfsstatus, daher bin ich mir nicht sicher, ob er in Zukunft übernommen wird, aber ich werde mein Verständnis notieren.
Überblick
- Frühere Typanmerkungen verwendeten dedizierte Typen zur Darstellung von Sammlungen (z. B. "typing.List" und "typing.Dict").
- Integrieren Sie Sammlungsimplementierungs- und Typklassen, um Standard-Sammlungsklassen (wie "Liste" und "Diktat") für Typanmerkungen zuzulassen
- Ich möchte den generischen Sammlungstyp unter "Typisierung" abschaffen
der Begriff
- Generic
- Parametrierbarer Typ. Bezieht sich im Allgemeinen auf einen Container.
- Auch als parametrischer Typ und generischer Typ bekannt.
- Beispiel:
dict
- parametrized generic
- Eine Instanz von Generic, die den Typ des Containerelements angibt
- Auch als parametrisierter Typ bekannt.
- Beispiel:
dict [str, int]
Ansatz
Verwenden Sie "list" oder "dict" anstelle der vorherigen "typing.List" oder "typing.Dict". das ist alles.
def find(haystack: dict[str, list[int]]) -> int:
...
Was nicht zu tun
- Unterstützt nicht "isinstance (obj, list [int])"
- Unterstützt nicht "issubclass (cls, list [str])"
Memo
Intern soll eine Instanz von "types.GenericAlias" erstellt werden. Daher können Typinformationen mit __origin__
oder __args__
abgerufen werden.
StrList = list[str]
assert isinstance(StrList, types.GenericAlias)
assert StrList.__origin__ is list
assert StrList.__args__ is (str,)
Impressionen
- Es ist nicht einfach, einen Typ für Anmerkungen zu haben, abgesehen von der Klasse, die Sie normalerweise verwenden. Das sieht also sehr gut aus (obwohl ich daran gewöhnt bin).
- Es ist schwer, mit altem Code zu schreien, wenn die generische Art der Eingabe abgeschafft wird (ungefähr 5 Jahre später?)
- Mit fortschreitender Version von Python3 habe ich das Gefühl, dass die Typanmerkungen stark an die Python-Sprachspezifikation gebunden sind.
- Die Typprüfung befindet sich noch außerhalb, aber beim Schreiben von Python sollte der Ablauf darin bestehen, die Form zu schreiben ...
- Ich habe das Gefühl, dass es nicht aufhört, wenn es für Leistung und Tests verwendet wird
Nachtrag
Bevor ich es wusste, wurde beschlossen, PEP 585 (Akzeptiert) zu übernehmen, und es war in 3.9.0a6 verfügbar. Unten sehen Sie den Status von 3.9-dev, der vor einiger Zeit installiert wurde.
$ python3.9
Python 3.9.0a6+ (heads/master:7f7e706, May 9 2020, 13:35:20)
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> list[int]
list[int]
>>> dict[str, int]
dict[str, int]
>>> tuple[int, ...]
tuple[int, ...]