types — Dynamische Typerzeugung und Namen für integrierte Typen¶
Quellcode: Lib/types.py
Dieses Modul legt Hilfsfunktionen fest, die beim dynamischen Erzeugen neuer Typen unterstützen.
Es legt außerdem Namen für einige Objekttypen fest, die der Standard-Python-Interpreter verwendet, die aber nicht als integrierte Namen bereitstehen, wie es int oder str tun.
Schließlich stellt es einige weitere Hilfsklassen und Hilfsfunktionen rund um Typen bereit, die nicht grundlegend genug sind, um integriert zu sein.
Dynamische Typerzeugung¶
- types.new_class(name, bases=(), kwds=None, exec_body=None)¶
Erzeugt dynamisch ein Klassenobjekt über die passende Metaklasse.
Die ersten drei Argumente sind die Bestandteile, aus denen der Kopf einer Klassendefinition besteht: der Klassenname, die Basisklassen (in ihrer Reihenfolge) und die Schlüsselwortargumente (etwa
metaclass).Das Argument exec_body ist ein Callback, über den der frisch erzeugte Namensraum der Klasse gefüllt wird. Es sollte den Namensraum der Klasse als einziges Argument annehmen und den Namensraum unmittelbar um die Inhalte der Klasse ergänzen. Ist kein Callback angegeben, hat das dieselbe Wirkung, wie
lambda ns: Nonezu übergeben.Added in version 3.3.
- types.prepare_class(name, bases=(), kwds=None)¶
Berechnet die passende Metaklasse und erzeugt den Namensraum der Klasse.
Die Argumente sind die Bestandteile, aus denen der Kopf einer Klassendefinition besteht: der Klassenname, die Basisklassen (in ihrer Reihenfolge) und die Schlüsselwortargumente (etwa
metaclass).Der Rückgabewert ist ein 3-Tupel:
metaclass, namespace, kwdsmetaclass ist die passende Metaklasse, namespace der vorbereitete Namensraum der Klasse und kwds eine aktualisierte Kopie des übergebenen Arguments kwds, aus der jeder Eintrag
'metaclass'entfernt wurde. Ist kein Argument kwds übergeben worden, ist dies ein leeres dict.Added in version 3.3.
Geändert in Version 3.6: Der Vorgabewert für das Element
namespacedes zurückgegebenen Tupels hat sich geändert. Es wird jetzt ein Mapping verwendet, das die Einfügereihenfolge bewahrt, wenn die Metaklasse keine Methode__prepare__hat.
Siehe auch
- Metaklassen
Alle Einzelheiten zum Ablauf der Klassenerzeugung, den diese Funktionen unterstützen
- PEP 3115 - Metaclasses in Python 3000
Führte den Namensraum-Hook
__prepare__ein
- types.resolve_bases(bases)¶
Löst MRO-Einträge dynamisch auf, wie PEP 560 es angibt.
Diese Funktion sucht in bases nach Elementen, die keine Instanzen von
typesind, und gibt ein Tupel zurück, in dem jedes solche Objekt, das eine Methode__mro_entries__()hat, durch das entpackte Ergebnis eines Aufrufs dieser Methode ersetzt ist. Ist ein Element von bases eine Instanz vontypeoder hat es keine Methode__mro_entries__(), wird es unverändert in das zurückgegebene Tupel aufgenommen.Added in version 3.7.
- types.get_original_bases(cls, /)¶
Gibt das Tupel der Objekte zurück, die ursprünglich als Basisklassen von cls angegeben wurden, bevor die Methode
__mro_entries__()auf irgendwelchen Basisklassen aufgerufen wurde (nach den in PEP 560 dargelegten Mechanismen). Das ist nützlich, um Generics zu untersuchen.Bei Klassen, die ein Attribut
__orig_bases__haben, gibt diese Funktion den Wert voncls.__orig_bases__zurück. Bei Klassen ohne das Attribut__orig_bases__wirdcls.__bases__zurückgegeben.Beispiele:
from typing import TypeVar, Generic, NamedTuple, TypedDict T = TypeVar("T") class Foo(Generic[T]): ... class Bar(Foo[int], float): ... class Baz(list[str]): ... Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) Spam = TypedDict("Spam", {"a": int, "b": str}) assert Bar.__bases__ == (Foo, float) assert get_original_bases(Bar) == (Foo[int], float) assert Baz.__bases__ == (list,) assert get_original_bases(Baz) == (list[str],) assert Eggs.__bases__ == (tuple,) assert get_original_bases(Eggs) == (NamedTuple,) assert Spam.__bases__ == (dict,) assert get_original_bases(Spam) == (TypedDict,) assert int.__bases__ == (object,) assert get_original_bases(int) == (object,)
Added in version 3.12.
Siehe auch
PEP 560 - Core support for typing module and generic types
Standardtypen des Interpreters¶
Dieses Modul stellt Namen für viele der Typen bereit, die zum Umsetzen eines Python-Interpreters nötig sind. Es vermeidet bewusst, einige der Typen aufzunehmen, die nur nebenbei während der Verarbeitung entstehen, etwa den Typ listiterator.
Üblicherweise werden diese Namen für Prüfungen mit isinstance() oder issubclass() verwendet.
Erzeugst du eine Instanz eines dieser Typen, beachte, dass die Signaturen zwischen Python-Versionen abweichen können.
Für die folgenden Typen sind Standardnamen festgelegt:
- class types.FunctionType¶
- class types.LambdaType¶
Der Typ selbst definierter Funktionen und von Funktionen, die durch
lambda-Ausdrücke erzeugt wurden.Löst ein Auditing-Ereignis
function.__new__mit dem Argumentcodeaus.Das Audit-Ereignis tritt nur beim unmittelbaren Erzeugen von Funktionsobjekten auf und wird beim normalen Kompilieren nicht ausgelöst.
- class types.GeneratorType¶
Der Typ von Generator-Iterator-Objekten, die von Generatorfunktionen erzeugt werden.
- class types.CoroutineType¶
Der Typ von Coroutine-Objekten, die von
async def-Funktionen erzeugt werden.Added in version 3.5.
- class types.AsyncGeneratorType¶
Der Typ von Iterator-Objekten asynchroner Generatoren, die von asynchronen Generatorfunktionen erzeugt werden.
Added in version 3.6.
- class types.CodeType(**kwargs)¶
Der Typ von Codeobjekten, wie
compile()sie zurückgibt.Löst ein Auditing-Ereignis
code.__new__mit den Argumentencode,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flagsaus.Beachte, dass die auditierten Argumente nicht zu den Namen oder Positionen passen müssen, die der Initialisierer verlangt. Das Audit-Ereignis tritt nur beim unmittelbaren Erzeugen von Codeobjekten auf und wird beim normalen Kompilieren nicht ausgelöst.
- class types.CellType¶
Der Typ für Cell-Objekte: Solche Objekte werden als Container für die Closure-Variablen einer Funktion verwendet.
Added in version 3.8.
- class types.MethodType¶
Der Typ von Methoden selbst definierter Klasseninstanzen.
- class types.BuiltinFunctionType¶
- class types.BuiltinMethodType¶
Der Typ integrierter Funktionen wie
len()odersys.exit()und von Methoden integrierter Klassen. (Hier bedeutet der Begriff „integriert“ „in C geschrieben“.)
- class types.WrapperDescriptorType¶
Der Typ von Methoden einiger integrierter Datentypen und Basisklassen, etwa
object.__init__()oderobject.__lt__().Added in version 3.7.
- class types.MethodWrapperType¶
Der Typ gebundener Methoden einiger integrierter Datentypen und Basisklassen. Es ist zum Beispiel der Typ von
object().__str__.Added in version 3.7.
- class types.NotImplementedType¶
Der Typ von
NotImplemented.Added in version 3.10.
- class types.MethodDescriptorType¶
Der Typ von Methoden einiger integrierter Datentypen, etwa
str.join().Added in version 3.7.
- class types.ClassMethodDescriptorType¶
Der Typ ungebundener Klassenmethoden einiger integrierter Datentypen, etwa
dict.__dict__['fromkeys'].Added in version 3.7.
- class types.ModuleType(name, doc=None)¶
Der Typ von Modulen. Der Konstruktor nimmt den Namen des zu erzeugenden Moduls und wahlweise seinen Docstring.
Siehe auch
- Dokumentation zu Modulobjekten
Liefert Einzelheiten zu den besonderen Attributen, die sich auf Instanzen von
ModuleTypefinden.importlib.util.module_from_spec()Module, die über den Konstruktor
ModuleTypeerzeugt werden, entstehen mit vielen ihrer besonderen Attribute ungesetzt oder auf Vorgabewerte gesetzt.module_from_spec()bietet einen robusteren Weg,ModuleType-Instanzen zu erzeugen, der dafür sorgt, dass die verschiedenen Attribute passend gesetzt werden.
- class types.GenericAlias(t_origin, t_args)¶
Der Typ parametrisierter Generics, etwa
list[int].t_originsollte eine nicht parametrisierte generische Klasse sein, etwalist,tupleoderdict.t_argssollte eintuple(möglicherweise der Länge 1) von Typen sein, diet_originparametrisieren:>>> from types import GenericAlias >>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
Added in version 3.9.
Geändert in Version 3.9.2: Von diesem Typ lassen sich jetzt Unterklassen bilden.
Siehe auch
- Generische Alias-Typen
Ausführliche Dokumentation zu Instanzen von
types.GenericAlias- PEP 585 - Type Hinting Generics In Standard Collections
Führt die Klasse
types.GenericAliasein
- class types.UnionType¶
Der Typ von Union-Typausdrücken.
Added in version 3.10.
Geändert in Version 3.14: Das ist jetzt ein Alias für
typing.Union.
- class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶
Der Typ von Traceback-Objekten, wie sie sich etwa in
sys.exception().__traceback__finden.Einzelheiten zu den verfügbaren Attributen und Operationen sowie Hinweise zum dynamischen Erzeugen von Tracebacks stehen in der Sprachreferenz.
- class types.FrameType¶
Der Typ von Frame-Objekten, wie sie sich etwa in
tb.tb_framefinden, wenntbein Traceback-Objekt ist.
- class types.FrameLocalsProxyType¶
Der Typ von Proxy-Objekten für die lokalen Namen eines Frames, wie sie sich am Attribut
frame.f_localsfinden.Added in version 3.15.
Siehe auch
- class types.LazyImportType¶
Der Typ von Proxy-Objekten für verzögerte Importe. Diese Objekte werden erzeugt, wenn ein Modul verzögert importiert wird, und dienen als Platzhalter, bis das Modul tatsächlich angesprochen wird. Über diesen Typ lassen sich verzögerte Importe programmatisch erkennen.
Added in version 3.15.
Siehe auch
- resolve()¶
Löst den verzögerten Import auf und gibt das „echte“ importierte Objekt zurück.
- class types.GetSetDescriptorType¶
Der Typ von Objekten, die in Erweiterungsmodulen mit
PyGetSetDefdefiniert sind, etwaFrameType.f_localsoderarray.array.typecode. Dieser Typ wird als Deskriptor für Objektattribute verwendet. Er hat denselben Zweck wie der Typproperty, aber für Klassen, die in Erweiterungsmodulen definiert sind.
- class types.MemberDescriptorType¶
Der Typ von Objekten, die in Erweiterungsmodulen mit
PyMemberDefdefiniert sind, etwadatetime.timedelta.days. Dieser Typ wird als Deskriptor für einfache C-Datenmember verwendet, die standardmäßige Umwandlungsfunktionen nutzen. Er hat denselben Zweck wie der Typproperty, aber für Klassen, die in Erweiterungsmodulen definiert sind.Ist eine Klasse außerdem mit einem Attribut
__slots__definiert, wird für jeden Slot eine Instanz vonMemberDescriptorTypeals Attribut an der Klasse hinzugefügt. Damit kann der Slot im__dict__der Klasse erscheinen.In anderen Umsetzungen von Python kann dieser Typ mit
GetSetDescriptorTypeübereinstimmen.
- class types.MappingProxyType(mapping)¶
Nur lesbarer Proxy eines Mappings. Er bietet eine dynamische View auf die Einträge des Mappings, das heißt: Ändert sich das Mapping, spiegelt die View diese Änderungen wider.
MappingProxyTypes sind über zwei Typen generisch und geben damit (in dieser Reihenfolge) die Typen der Schlüssel und der Werte des zugrunde liegenden Mappings an.Added in version 3.3.
Geändert in Version 3.9: Erweitert um Unterstützung für den neuen Union-Operator (
|) aus PEP 584, der einfach an das zugrunde liegende Mapping weiterdelegiert.- key in proxy
Gibt
Truezurück, wenn das zugrunde liegende Mapping einen Schlüssel key hat, sonstFalse.
- proxy[key]
Gibt das Element des zugrunde liegenden Mappings mit dem Schlüssel key zurück. Löst ein
KeyErroraus, wenn key nicht im zugrunde liegenden Mapping ist.
- iter(proxy)
Gibt einen Iterator über die Schlüssel des zugrunde liegenden Mappings zurück. Das ist eine Kurzform für
iter(proxy.keys()).
- len(proxy)
Gibt die Anzahl der Elemente im zugrunde liegenden Mapping zurück.
- copy()¶
Gibt eine flache Kopie des zugrunde liegenden Mappings zurück.
- get(key[, default])¶
Gibt den Wert für key zurück, wenn key im zugrunde liegenden Mapping ist, sonst default. Ist default nicht angegeben, ist es
None, sodass diese Methode nie einKeyErrorauslöst.
- items()¶
Gibt eine neue View auf die Elemente des zugrunde liegenden Mappings zurück (
(key, value)-Paare).
- keys()¶
Gibt eine neue View auf die Schlüssel des zugrunde liegenden Mappings zurück.
- values()¶
Gibt eine neue View auf die Werte des zugrunde liegenden Mappings zurück.
- reversed(proxy)
Gibt einen umgekehrten Iterator über die Schlüssel des zugrunde liegenden Mappings zurück.
Added in version 3.9.
- hash(proxy)
Gibt einen Hash des zugrunde liegenden Mappings zurück.
Added in version 3.12.
- class types.CapsuleType¶
Der Typ von Capsule-Objekten.
Added in version 3.13.
Weitere Hilfsklassen und Hilfsfunktionen¶
- class types.SimpleNamespace¶
Eine einfache Unterklasse von
object, die Attributzugriff auf ihren Namensraum bietet sowie eine aussagekräftige repr-Ausgabe.Anders als bei
objectkannst du beiSimpleNamespaceAttribute hinzufügen und entfernen.SimpleNamespace-Objekte lassen sich auf dieselbe Weise wiedictinitialisieren: mit Schlüsselwortargumenten, mit einem einzelnen Positionsargument oder mit beidem. Bei der Initialisierung mit Schlüsselwortargumenten werden diese unmittelbar dem zugrunde liegenden Namensraum hinzugefügt. Wird stattdessen mit einem Positionsargument initialisiert, wird der zugrunde liegende Namensraum um die Schlüssel-Wert-Paare aus diesem Argument ergänzt (entweder ein Mapping-Objekt oder ein iterierbares Objekt, das Schlüssel-Wert-Paare erzeugt). Alle diese Schlüssel müssen Zeichenketten sein.Der Typ entspricht in etwa dem folgenden Code:
class SimpleNamespace: def __init__(self, mapping_or_iterable=(), /, **kwargs): self.__dict__.update(mapping_or_iterable) self.__dict__.update(kwargs) def __repr__(self): items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): return self.__dict__ == other.__dict__ return NotImplemented
SimpleNamespacekann als Ersatz fürclass NS: passnützlich sein. Für einen strukturierten Datensatztyp verwende abernamedtuple().SimpleNamespace-Objekte werden voncopy.replace()unterstützt.Added in version 3.3.
Geändert in Version 3.9: Die Reihenfolge der Attribute in der repr-Ausgabe hat sich von alphabetisch zur Einfügereihenfolge geändert (wie bei
dict).Geändert in Version 3.13: Unterstützung für ein wahlfreies Positionsargument hinzugefügt.
- types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
Leitet Attributzugriff auf einer Klasse an __getattr__ weiter.
Das ist ein Deskriptor, mit dem Attribute definiert werden, die sich beim Zugriff über eine Instanz anders verhalten als beim Zugriff über eine Klasse. Der Zugriff über eine Instanz bleibt normal, der Zugriff auf ein Attribut über eine Klasse wird aber an die Methode __getattr__ der Klasse weitergeleitet. Das geschieht, indem ein AttributeError ausgelöst wird.
Damit lassen sich Propertys auf einer Instanz aktiv halten und gleichzeitig virtuelle Attribute gleichen Namens auf der Klasse haben (ein Beispiel steht unter
enum.Enum).Added in version 3.4.
Hilfsfunktionen für Coroutinen¶
- types.coroutine(gen_func)¶
Diese Funktion verwandelt eine Generator-Funktion in eine Coroutinen-Funktion, die eine auf einem Generator beruhende Coroutine zurückgibt. Die auf einem Generator beruhende Coroutine ist weiterhin ein Generator-Iterator, gilt aber auch als Coroutine-Objekt und ist abwartbar. Sie setzt allerdings nicht zwangsläufig die Methode
__await__()um.Ist gen_func eine Generatorfunktion, wird sie an ihrem Platz geändert.
Ist gen_func keine Generatorfunktion, wird sie eingehüllt. Gibt sie eine Instanz von
collections.abc.Generatorzurück, wird die Instanz in ein abwartbares Proxy-Objekt eingehüllt. Alle anderen Arten von Objekten werden unverändert zurückgegeben.Added in version 3.5.