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: None zu ü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, kwds

metaclass 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 namespace des 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 type sind, 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 von type oder 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 von cls.__orig_bases__ zurück. Bei Klassen ohne das Attribut __orig_bases__ wird cls.__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.NoneType

Der Typ von None.

Added in version 3.10.

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 Argument code aus.

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 Argumenten code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags aus.

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() oder sys.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__() oder object.__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 ModuleType finden.

importlib.util.module_from_spec()

Module, die über den Konstruktor ModuleType erzeugt 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.EllipsisType

Der Typ von Ellipsis.

Added in version 3.10.

class types.GenericAlias(t_origin, t_args)

Der Typ parametrisierter Generics, etwa list[int].

t_origin sollte eine nicht parametrisierte generische Klasse sein, etwa list, tuple oder dict. t_args sollte ein tuple (möglicherweise der Länge 1) von Typen sein, die t_origin parametrisieren:

>>> 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.GenericAlias ein

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_frame finden, wenn tb ein 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_locals finden.

Added in version 3.15.

Siehe auch

PEP 667

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

PEP 810

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 PyGetSetDef definiert sind, etwa FrameType.f_locals oder array.array.typecode. Dieser Typ wird als Deskriptor für Objektattribute verwendet. Er hat denselben Zweck wie der Typ property, aber für Klassen, die in Erweiterungsmodulen definiert sind.

class types.MemberDescriptorType

Der Typ von Objekten, die in Erweiterungsmodulen mit PyMemberDef definiert sind, etwa datetime.timedelta.days. Dieser Typ wird als Deskriptor für einfache C-Datenmember verwendet, die standardmäßige Umwandlungsfunktionen nutzen. Er hat denselben Zweck wie der Typ property, 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 von MemberDescriptorType als 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 True zurück, wenn das zugrunde liegende Mapping einen Schlüssel key hat, sonst False.

proxy[key]

Gibt das Element des zugrunde liegenden Mappings mit dem Schlüssel key zurück. Löst ein KeyError aus, 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 ein KeyError auslö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 object kannst du bei SimpleNamespace Attribute hinzufügen und entfernen.

SimpleNamespace-Objekte lassen sich auf dieselbe Weise wie dict initialisieren: 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

SimpleNamespace kann als Ersatz für class NS: pass nützlich sein. Für einen strukturierten Datensatztyp verwende aber namedtuple().

SimpleNamespace-Objekte werden von copy.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.Generator zurü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.