types — Dynamiskt skapande av typer och namn för inbyggda typer

Källkod: Lib/types.py


Denna modul definierar verktygsfunktioner för att underlätta dynamiskt skapande av nya typer.

Den definierar också namn för vissa objekttyper som används av Pythons standardtolk, men som inte exponeras som inbyggda objekt som int eller str.

Slutligen innehåller den några ytterligare typrelaterade verktygsklasser och funktioner som inte är tillräckligt grundläggande för att vara inbyggda.

Skapande av dynamisk typ

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

Skapar ett klassobjekt dynamiskt med hjälp av lämplig metaklass.

De tre första argumenten är de komponenter som utgör ett klassdefinitionshuvud: klassnamnet, basklasserna (i ordning), nyckelordsargumenten (t.ex. metaclass).

Argumentet exec_body är en callback som används för att fylla på den nyss skapade klassnamnrymden. Den bör acceptera klassens namnrymd som sitt enda argument och uppdatera namnrymden direkt med klassens innehåll. Om ingen återuppringning anges har det samma effekt som att skicka in lambda ns: None.

Tillagd i version 3.3.

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

Beräknar lämplig metaklass och skapar klassens namnrymd.

Argumenten är de komponenter som ingår i ett klassdefinitionshuvud: klassnamnet, basklasserna (i ordning) och nyckelordsargumenten (t.ex. metaclass).

Returvärdet är en 3-tupel: metaklass, namnrymd, kwds

metaclass är den lämpliga metaklassen, namespace är det förberedda klassnamnrymden och kwds är en uppdaterad kopia av det passerade kwds-argumentet med alla 'metaclass'-poster borttagna. Om inget kwds-argument skickas in kommer detta att vara en tom dict.

Tillagd i version 3.3.

Ändrad i version 3.6: Standardvärdet för namespace-elementet i den returnerade tupeln har ändrats. Nu används en mappning som bevarar insättningsordningen när metaklassen inte har någon metod __prepare__.

Se även

Metaklasser

Fullständiga detaljer om processen för att skapa klasser med stöd av dessa funktioner

PEP 3115 - Metaklasser i Python 3000

Införde namnrymdshaken __prepare__

types.resolve_bases(bases)

Löser MRO-poster dynamiskt enligt specifikationen i PEP 560.

Den här funktionen letar efter objekt i bases som inte är instanser av type och returnerar en tupel där varje sådant objekt som har en __mro_entries__()-metod ersätts med ett uppackat resultat av anropet av den här metoden. Om ett bases-objekt är en instans av type, eller om det inte har en __mro_entries__()-metod, ingår det oförändrat i retur-tupeln.

Tillagd i version 3.7.

types.get_original_bases(cls, /)

Returnerar den tupel av objekt som ursprungligen angavs som baser för cls innan metoden __mro_entries__() har anropats på några baser (enligt de mekanismer som beskrivs i PEP 560). Detta är användbart för introspektion av Generics.

För klasser som har attributet __orig_bases__ returnerar denna funktion värdet av cls.__orig_bases__. För klasser utan attributet __orig_bases__ returneras cls.__bases__.

Exempel:

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,)

Tillagd i version 3.12.

Se även

PEP 560 - Kärnstöd för typning av moduler och generiska typer

Standardtolktyper

Denna modul ger namn på många av de typer som krävs för att implementera en Python-tolk. Den undviker avsiktligt att inkludera några av de typer som bara uppstår av en slump under bearbetningen, till exempel typen listiterator.

Typisk användning av dessa namn är för isinstance() eller issubclass() kontroller.

Om du instansierar någon av dessa typer, observera att signaturerna kan variera mellan olika Python-versioner.

Standardnamn har definierats för följande typer:

types.NoneType

Typ av None.

Tillagd i version 3.10.

types.FunctionType
types.LambdaType

Typ av användardefinierade funktioner och funktioner som skapas av lambda-uttryck.

Utlöser en auditing event function.__new__ med argumentet code.

Revisionshändelsen inträffar endast vid direkt instansiering av funktionsobjekt och inte vid normal kompilering.

types.GeneratorType

Typ av generator-iteratorobjekt som skapas av generatorfunktioner.

types.CoroutineType

Typ av coroutine-objekt, skapade av async def-funktioner.

Tillagd i version 3.5.

types.AsyncGeneratorType

Typ av asynkron generator-iteratorobjekt, skapade av asynkrona generatorfunktioner.

Tillagd i version 3.6.

class types.CodeType(**kwargs)

Typen av code objects som t.ex. returneras av compile().

Utlöser en auditing-händelse code.__new__ med argumenten code, filnamn, namn, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

Observera att de granskade argumenten kanske inte matchar de namn eller positioner som krävs av initieraren. Granskningshändelsen inträffar endast vid direkt instansiering av kodobjekt och inte vid normal kompilering.

types.CellType

Typen för cellobjekt: sådana objekt används som behållare för en funktions closure variables.

Tillagd i version 3.8.

types.MethodType

Typen av metoder för användardefinierade klassinstanser.

types.BuiltinFunctionType
types.BuiltinMethodType

Typen av inbyggda funktioner som len() eller sys.exit(), och metoder för inbyggda klasser. (Här betyder termen ”inbyggd” ”skriven i C”)

types.WrapperDescriptorType

Typen av metoder för vissa inbyggda datatyper och basklasser, t.ex. object.__init__() eller object.__lt__().

Tillagd i version 3.7.

types.MethodWrapperType

Typen av bundna metoder för vissa inbyggda datatyper och basklasser. Det är t.ex. typen av object().__str__.

Tillagd i version 3.7.

types.NotImplementedType

Typen av NotImplemented.

Tillagd i version 3.10.

types.MethodDescriptorType

Typen av metoder för vissa inbyggda datatyper, t.ex. str.join().

Tillagd i version 3.7.

types.ClassMethodDescriptorType

Typen av obundna klassmetoder för vissa inbyggda datatyper, t.ex. dict.__dict__['fromkeys'].

Tillagd i version 3.7.

class types.ModuleType(name, doc=None)

Typen av moduler. Konstruktören tar namnet på den modul som ska skapas och eventuellt dess docstring.

Se även

Dokumentation för modulobjekt

Ger information om de specialattribut som finns på instanser av ModuleType.

importlib.util.module_from_spec()

Moduler som skapas med hjälp av ModuleType-konstruktören skapas med många av sina specialattribut oinställda eller inställda på standardvärden. module_from_spec() ger ett mer robust sätt att skapa ModuleType-instanser som säkerställer att de olika attributen ställs in på rätt sätt.

types.EllipsisType

Typ av Ellipsis.

Tillagd i version 3.10.

class types.GenericAlias(t_origin, t_args)

Typen av parameteriserade generiska såsom list[int].

t_origin skall vara en icke-parameteriserad generisk klass, t.ex. list, tuple eller dict. t_args skall vara en tuple (eventuellt av längd 1) av typer som parametriserar t_origin:

>>> from types import GenericAlias

>>> list[int] == GenericAlias(list, (int,))
True
>>> dict[str, int] == GenericAlias(dict, (str, int))
True

Tillagd i version 3.9.

Ändrad i version 3.9.2: Denna typ kan nu underklassificeras.

Se även

Generiska alias-typer

Fördjupad dokumentation av instanser av types.GenericAlias

PEP 585 - Typhintning av generiska i standardsamlingar

Vi introducerar types.GenericAlias-klassen

class types.UnionType

Typen av unionstyputtryck.

Tillagd i version 3.10.

Ändrad i version 3.14: Detta är nu ett alias för typing.Union.

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

Typen av spårningsobjekt som finns i sys.exception().__traceback__.

Se språkreferensen för mer information om tillgängliga attribut och operationer samt vägledning om hur man skapar dynamiska spårningar.

types.FrameType

Typen av frame objects som finns i tb.tb_frame om tb är ett traceback-objekt.

types.GetSetDescriptorType

Typen av objekt som definieras i tilläggsmoduler med PyGetSetDef, t.ex. FrameType.f_locals eller array.array.typecode. Den här typen används som deskriptor för objektattribut; den har samma syfte som typen property, men för klasser som definieras i tilläggsmoduler.

types.MemberDescriptorType

Typen av objekt som definieras i tilläggsmoduler med PyMemberDef, t.ex. datetime.timedelta.days. Den här typen används som deskriptor för enkla C-datamedlemmar som använder standardkonverteringsfunktioner; den har samma syfte som typen property, men för klasser som definieras i tilläggsmoduler.

Dessutom, när en klass definieras med attributet __slots__, kommer en instans av MemberDescriptorType att läggas till som attribut för varje slot i klassen. Detta gör att platsen kan visas i klassens __dict__.

I andra implementationer av Python kan denna typ vara identisk med GetSetDescriptorType.

class types.MappingProxyType(mapping)

Skrivskyddad proxy för en mappning. Den ger en dynamisk vy över mappningens poster, vilket innebär att när mappningen ändras återspeglas dessa ändringar i vyn.

Tillagd i version 3.3.

Ändrad i version 3.9: Uppdaterad för att stödja den nya operatorn union (|) från PEP 584, som helt enkelt delegerar till den underliggande mappningen.

key in proxy

Returnerar True om den underliggande mappningen har en nyckel key, annars False.

proxy[key]

Returnerar objektet i den underliggande mappningen med nyckel key. Utlöser ett KeyError om key inte finns i den underliggande mappningen.

iter(proxy)

Returnerar en iterator över nycklarna i den underliggande mappningen. Detta är en genväg till iter(proxy.keys()).

len(proxy)

Returnerar antalet objekt i den underliggande mappningen.

copy()

Returnerar en ytlig kopia av den underliggande mappningen.

get(key[, default])

Returnerar värdet för key om key finns i den underliggande mappningen, annars default. Om default inte anges är standardvärdet None, så att den här metoden aldrig ger upphov till ett KeyError.

items()

Returnerar en ny vy av den underliggande mappningens objekt (par av typen (nyckel, värde)).

keys()

Returnerar en ny vy av den underliggande mappningens nycklar.

values()

Returnerar en ny vy av den underliggande mappningens värden.

reversed(proxy)

Returnerar en omvänd iterator över nycklarna i den underliggande mappningen.

Tillagd i version 3.9.

hash(proxy)

Returnerar en hash av den underliggande mappningen.

Tillagd i version 3.12.

class types.CapsuleType

Typ av kapselobjekt.

Tillagd i version 3.13.

Ytterligare verktygsklasser och funktioner

class types.SimpleNamespace

En enkel object-underklass som ger attributåtkomst till dess namnrymd, samt en meningsfull repr.

Till skillnad från object kan du med SimpleNamespace lägga till och ta bort attribut.

SimpleNamespace-objekt kan initieras på samma sätt som dict: antingen med nyckelordsargument, med ett enda positionellt argument eller med båda. När de initieras med nyckelordsargument läggs de direkt till i den underliggande namnrymden. Alternativt, när den initieras med ett positionellt argument, kommer den underliggande namnrymden att uppdateras med nyckel-värde-par från det argumentet (antingen ett mappningsobjekt eller ett iterable-objekt som producerar nyckel-värde-par). Alla sådana nycklar måste vara strängar.

Typen motsvarar ungefär följande kod:

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 kan vara användbart som ersättning för class NS: pass. Men för en strukturerad posttyp använd namedtuple() istället.

SimpleNamespace-objekt stöds av copy.replace().

Tillagd i version 3.3.

Ändrad i version 3.9: Attributordningen i repr ändrades från alfabetisk till insertion (som dict).

Ändrad i version 3.13: Stöd för ett valfritt positionellt argument har lagts till.

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

Dirigera attributåtkomst för en klass till __getattr__.

Detta är en deskriptor som används för att definiera attribut som fungerar olika när de nås via en instans och via en klass. Instansåtkomst förblir normal, men åtkomst till ett attribut via en klass kommer att dirigeras till klassens __getattr__-metod; detta görs genom att AttributeError utlöses.

Detta gör att man kan ha egenskaper aktiva på en instans och ha virtuella attribut på klassen med samma namn (se enum.Enum för ett exempel).

Tillagd i version 3.4.

Verktygsfunktioner för Coroutine

types.coroutine(gen_func)

Denna funktion omvandlar en generator-funktion till en coroutine-funktion som returnerar en generatorbaserad coroutine. Den generatorbaserade coroutinen är fortfarande en generator iterator, men anses också vara ett coroutine-objekt och är awaitable. Den behöver dock inte nödvändigtvis implementera metoden __await__().

Om gen_func är en generatorfunktion kommer den att modifieras på plats.

Om gen_func inte är en generatorfunktion kommer den att paketeras. Om den returnerar en instans av collections.abc.Generator, kommer instansen att packas in i ett awaitable proxyobjekt. Alla andra typer av objekt kommer att returneras som de är.

Tillagd i version 3.5.