types — Dynamische Typenerstellung und Namen für integrierte Typen

Quellcode: Lib/types.py


Dieses Modul definiert Hilfsfunktionen zur Unterstützung der dynamischen Erstellung neuer Typen.

Es definiert auch Namen für einige Objekttypen, die vom Standard-Python-Interpreter verwendet werden, aber nicht als integrierte Typen wie int oder str, verfügbar gemacht werden.

Schließlich bietet es einige zusätzliche typbezogene Hilfsklassen und Funktionen, die nicht grundlegend genug sind, um integrierte Typen zu sein.

Dynamische Typenerstellung

types.new_class(name, bases=(), kwds=None, exec_body=None)

Erstellt dynamisch ein Klassenobjekt unter Verwendung der entsprechenden Metaklasse.

Die ersten drei Argumente sind die Komponenten, aus denen sich ein Klassendefinitionskopf zusammensetzt: der Klassenname, die Basisklassen (in Reihenfolge), die Schlüsselwortargumente (wie metaclass).

Das Argument exec_body ist ein Callback, der verwendet wird, um den frisch erstellten Klassennamenraum zu füllen. Es sollte den Klassennamenraum als einziges Argument akzeptieren und den Namenraum direkt mit dem Klasseninhalt aktualisieren. Wenn kein Callback angegeben wird, hat dies denselben Effekt wie die Übergabe von lambda ns: None.

Hinzugefügt in Version 3.3.

types.prepare_class(name, bases=(), kwds=None)

Berechnet die entsprechende Metaklasse und erstellt den Klassennamenraum.

Die Argumente sind die Komponenten, aus denen sich ein Klassendefinitionskopf zusammensetzt: der Klassenname, die Basisklassen (in Reihenfolge) und die Schlüsselwortargumente (wie metaclass).

Der Rückgabewert ist ein 3-Tupel: metaclass, namespace, kwds

metaclass ist die entsprechende Metaklasse, namespace ist der vorbereitete Klassennamenraum und kwds ist eine aktualisierte Kopie des übergebenen kwds-Arguments mit entferntem 'metaclass'-Eintrag. Wenn kein kwds-Argument übergeben wird, ist dies ein leeres Dictionary.

Hinzugefügt in Version 3.3.

Geändert in Version 3.6: Der Standardwert für das Element namespace des zurückgegebenen Tupels wurde geändert. Nun wird eine Einfügungsreihenfolge beibehaltende Zuordnung verwendet, wenn die Metaklasse keine __prepare__-Methode hat.

Siehe auch

Metaklassen

Vollständige Details des Klassenkonstruktionsprozesses, der von diesen Funktionen unterstützt wird

PEP 3115 — Metaklassen in Python 3000

Führte den __prepare__-Namespace-Hook ein

types.resolve_bases(bases)

Löst MRO-Einträge dynamisch gemäß PEP 560 auf.

Diese Funktion sucht nach Elementen in bases, die keine Instanzen von type sind, und gibt ein Tupel zurück, in dem jedes solche Objekt, das eine __mro_entries__()-Methode hat, durch ein entpacktes Ergebnis des Aufrufs dieser Methode ersetzt wird. Wenn ein bases-Element eine Instanz von type ist oder keine __mro_entries__()-Methode hat, wird es unverändert in das Rückgabetupel aufgenommen.

Hinzugefügt in Version 3.7.

types.get_original_bases(cls, /)

Gibt das Tupel von Objekten zurück, die ursprünglich als Basen von cls übergeben wurden, bevor die __mro_entries__()-Methode für beliebige Basen aufgerufen wurde (gemäß den Mechanismen in PEP 560). Dies ist nützlich für die Introspektion von Generics.

Für Klassen, die ein Attribut __orig_bases__ haben, gibt diese Funktion den Wert von cls.__orig_bases__ zurück. Für 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,)

Hinzugefügt in Version 3.12.

Siehe auch

PEP 560 — Kernunterstützung für das Typing-Modul und generische Typen

Standard-Interpreter-Typen

Dieses Modul stellt Namen für viele der Typen bereit, die zur Implementierung eines Python-Interpreters erforderlich sind. Es vermeidet bewusst die Aufnahme einiger Typen, die nur zufällig während der Verarbeitung entstehen, wie z. B. der Typ listiterator.

Typische Verwendungen dieser Namen sind für isinstance()- oder issubclass()-Prüfungen.

Wenn Sie eine dieser Arten instanziieren, beachten Sie, dass sich Signaturen zwischen Python-Versionen unterscheiden können.

Für die folgenden Typen sind Standardnamen definiert

types.NoneType

Der Typ von None.

Hinzugefügt in Version 3.10.

types.FunctionType
types.LambdaType

Der Typ von benutzerdefinierten Funktionen und Funktionen, die durch lambda-Ausdrücke erstellt wurden.

Löst ein Audit-Ereignis function.__new__ mit dem Argument code aus.

Das Audit-Ereignis tritt nur bei direkter Instanziierung von Funktions-Objekten auf und wird nicht bei normaler Kompilierung ausgelöst.

types.GeneratorType

Der Typ von Generator-Iterator-Objekten, die von Generatorfunktionen erstellt werden.

types.CoroutineType

Der Typ von Coroutine-Objekten, die von async def-Funktionen erstellt werden.

Hinzugefügt in Version 3.5.

types.AsyncGeneratorType

Der Typ von asynchronen Generator-Iterator-Objekten, die von asynchronen Generatorfunktionen erstellt werden.

Hinzugefügt in Version 3.6.

class types.CodeType(**kwargs)

Der Typ von Code-Objekten, wie sie von compile() zurückgegeben werden.

Löst ein Audit-Ereignis code.__new__ mit den Argumenten code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags aus.

Beachten Sie, dass die auditierten Argumente möglicherweise nicht mit den Namen oder Positionen übereinstimmen, die der Initialisierer benötigt. Das Audit-Ereignis tritt nur bei direkter Instanziierung von Code-Objekten auf und wird nicht bei normaler Kompilierung ausgelöst.

types.CellType

Der Typ für Cell-Objekte: solche Objekte werden als Container für die Closure-Variablen einer Funktion verwendet.

Hinzugefügt in Version 3.8.

types.MethodType

Der Typ von Methoden von Instanzen benutzerdefinierter Klassen.

types.BuiltinFunctionType
types.BuiltinMethodType

Der Typ von integrierten Funktionen wie len() oder sys.exit() und Methoden integrierter Klassen. (Hier bedeutet der Begriff „integriert“ „in C geschrieben“.)

types.WrapperDescriptorType

Der Typ von Methoden einiger integrierter Datentypen und Basisklassen wie object.__init__() oder object.__lt__().

Hinzugefügt in Version 3.7.

types.MethodWrapperType

Der Typ von *gebundenen* Methoden einiger integrierter Datentypen und Basisklassen. Zum Beispiel ist es der Typ von object().__str__.

Hinzugefügt in Version 3.7.

types.NotImplementedType

Der Typ von NotImplemented.

Hinzugefügt in Version 3.10.

types.MethodDescriptorType

Der Typ von Methoden einiger integrierter Datentypen wie str.join().

Hinzugefügt in Version 3.7.

types.ClassMethodDescriptorType

Der Typ von *ungebundenen* Klassenmethoden einiger integrierter Datentypen wie dict.__dict__['fromkeys'].

Hinzugefügt in Version 3.7.

class types.ModuleType(name, doc=None)

Der Typ von Modulen. Der Konstruktor nimmt den Namen des zu erstellenden Moduls und optional seinen Docstring entgegen.

Siehe auch

Dokumentation zu Modul-Objekten

Bietet Details zu den speziellen Attributen, die auf Instanzen von ModuleType zu finden sind.

importlib.util.module_from_spec()

Module, die mit dem Konstruktor ModuleType erstellt wurden, werden mit vielen ihrer speziellen Attribute auf nicht gesetzt oder auf Standardwerte gesetzt erstellt. module_from_spec() bietet eine robustere Methode zur Erstellung von ModuleType-Instanzen, die sicherstellt, dass die verschiedenen Attribute korrekt gesetzt sind.

types.EllipsisType

Der Typ von Ellipsis.

Hinzugefügt in Version 3.10.

class types.GenericAlias(t_origin, t_args)

Der Typ von parametrisierten Generics wie list[int].

t_origin sollte eine nicht-parametrisierte generische Klasse sein, wie z. B. list, tuple oder dict. t_args sollte ein Tupel (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

Hinzugefügt in Version 3.9.

Geändert in Version 3.9.2: Dieser Typ kann jetzt Unterklassen bilden.

Siehe auch

Generische Alias-Typen

Detaillierte Dokumentation zu Instanzen von types.GenericAlias

PEP 585 — Typ-Hinting für Generics in Standard-Sammlungen

Einführung der Klasse types.GenericAlias

class types.UnionType

Der Typ von Union-Typ-Ausdrücken.

Hinzugefügt in Version 3.10.

Geändert in Version 3.14: Dies 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 in sys.exception().__traceback__ gefunden werden.

Siehe die Sprachreferenz für Details zu den verfügbaren Attributen und Operationen sowie Hinweise zur dynamischen Erstellung von Tracebacks.

types.FrameType

Der Typ von Frame-Objekten, wie sie in tb.tb_frame gefunden werden, wenn tb ein Traceback-Objekt ist.

types.GetSetDescriptorType

Der Typ von Objekten, die in Erweiterungsmodulen mit PyGetSetDef definiert sind, wie z. B. 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.

types.MemberDescriptorType

Der Typ von Objekten, die in Erweiterungsmodulen mit PyMemberDef definiert sind, wie z. B. datetime.timedelta.days. Dieser Typ wird als Deskriptor für einfache C-Datenmember verwendet, die Standardkonvertierungsfunktionen verwenden; er hat denselben Zweck wie der Typ property, aber für Klassen, die in Erweiterungsmodulen definiert sind.

Zusätzlich wird, wenn eine Klasse mit einem Attribut __slots__ definiert wird, für jeden Slot eine Instanz von MemberDescriptorType als Attribut der Klasse hinzugefügt. Dies ermöglicht es dem Slot, im __dict__ der Klasse zu erscheinen.

CPython-Implementierungsdetail: In anderen Implementierungen von Python kann dieser Typ identisch mit GetSetDescriptorType sein.

class types.MappingProxyType(mapping)

Schreibgeschützter Proxy für eine Zuordnung. Er bietet eine dynamische Ansicht auf die Einträge der Zuordnung, was bedeutet, dass die Ansicht diese Änderungen widerspiegelt, wenn sich die Zuordnung ändert.

Hinzugefügt in Version 3.3.

Geändert in Version 3.9: Aktualisiert zur Unterstützung des neuen Union-Operators (|) aus PEP 584, der einfach an die zugrunde liegende Zuordnung delegiert.

key in proxy

Gibt True zurück, wenn die zugrunde liegende Zuordnung einen Schlüssel key hat, andernfalls False.

proxy[key]

Gibt das Element der zugrunde liegenden Zuordnung mit dem Schlüssel key zurück. Löst einen KeyError aus, wenn key nicht in der zugrunde liegenden Zuordnung vorhanden ist.

iter(proxy)

Gibt einen Iterator über die Schlüssel der zugrunde liegenden Zuordnung zurück. Dies ist eine Abkürzung für iter(proxy.keys()).

len(proxy)

Gibt die Anzahl der Elemente in der zugrunde liegenden Zuordnung zurück.

copy()

Gibt eine flache Kopie der zugrunde liegenden Zuordnung zurück.

get(key[, default])

Gibt den Wert für key zurück, wenn key in der zugrunde liegenden Zuordnung vorhanden ist, andernfalls default. Wenn default nicht angegeben ist, ist es standardmäßig None, so dass diese Methode niemals einen KeyError auslöst.

items()

Gibt eine neue Ansicht der Elemente der zugrunde liegenden Zuordnung zurück ((key, value)-Paare).

keys()

Gibt eine neue Ansicht der Schlüssel der zugrunde liegenden Zuordnung zurück.

values()

Gibt eine neue Ansicht der Werte der zugrunde liegenden Zuordnung zurück.

reversed(proxy)

Gibt einen umgekehrten Iterator über die Schlüssel der zugrunde liegenden Zuordnung zurück.

Hinzugefügt in Version 3.9.

hash(proxy)

Gibt einen Hash der zugrunde liegenden Zuordnung zurück.

Hinzugefügt in Version 3.12.

class types.CapsuleType

Der Typ von Capsule-Objekten.

Hinzugefügt in Version 3.13.

Zusätzliche Hilfsklassen und Funktionen

class types.SimpleNamespace

Eine einfache object-Unterklasse, die Attributzugriff auf ihren Namensraum sowie eine aussagekräftige Darstellung (repr) bietet.

Im Gegensatz zu object können Sie mit SimpleNamespace Attribute hinzufügen und entfernen.

SimpleNamespace-Objekte können auf die gleiche Weise wie dict initialisiert werden: entweder mit Schlüsselwortargumenten, mit einem einzelnen positionsgebundenen Argument oder mit beidem. Wenn mit Schlüsselwortargumenten initialisiert, werden diese direkt dem zugrunde liegenden Namensraum hinzugefügt. Alternativ, wenn mit einem positionsgebundenen Argument initialisiert, wird der zugrunde liegende Namensraum mit Schlüssel-Wert-Paaren aus diesem Argument (entweder ein Zuordnungsobjekt oder ein iterierbares Objekt, das Schlüssel-Wert-Paare liefert) aktualisiert. Alle solchen Schlüssel müssen Zeichenketten sein.

Der Typ entspricht ungefähr 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 Aufzeichnungstyp sollten Sie jedoch stattdessen namedtuple() verwenden.

SimpleNamespace-Objekte werden von copy.replace() unterstützt.

Hinzugefügt in Version 3.3.

Geändert in Version 3.9: Die Attributreihenfolge in der Darstellung (repr) änderte sich von alphabetisch zu Einfügung (wie bei dict).

Geändert in Version 3.13: Unterstützung für ein optionales positionsgebundenes Argument hinzugefügt.

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

Leitet den Attributzugriff auf eine Klasse an __getattr__ weiter.

Dies ist ein Deskriptor, der verwendet wird, um Attribute zu definieren, die sich unterschiedlich verhalten, wenn sie über eine Instanz und über eine Klasse abgerufen werden. Der Instanzzugriff bleibt normal, aber der Zugriff auf ein Attribut über eine Klasse wird an die __getattr__-Methode der Klasse weitergeleitet; dies geschieht durch Auslösen einer AttributeError.

Dies ermöglicht es, Eigenschaften auf einer Instanz zu haben und virtuelle Attribute auf der Klasse mit demselben Namen zu haben (siehe enum.Enum als Beispiel).

Hinzugefügt in Version 3.4.

Coroutine-Hilfsfunktionen

types.coroutine(gen_func)

Diese Funktion wandelt eine Generatorfunktion in eine Koroutinenfunktion um, die eine generatorbasierte Koroutine zurückgibt. Die generatorbasierte Koroutine ist immer noch ein Generator-Iterator, wird aber auch als Koroutine-Objekt betrachtet und ist awaitable. Möglicherweise implementiert sie jedoch nicht notwendigerweise die Methode __await__().

Wenn gen_func eine Generatorfunktion ist, wird sie direkt modifiziert.

Wenn gen_func keine Generatorfunktion ist, wird sie umschlossen. Wenn sie eine Instanz von collections.abc.Generator zurückgibt, wird die Instanz in ein awaitable Proxy-Objekt umschlossen. Alle anderen Arten von Objekten werden unverändert zurückgegeben.

Hinzugefügt in Version 3.5.