types — Creación de tipos dinámicos y nombres para tipos integrados

Código fuente: Lib/types.py


Este módulo define funciones de utilidad para ayudar en la creación dinámica de tipos nuevos.

Este también define nombres para algunos tipos de objetos que son utilizados por el intérprete estándar de Python, pero no expuestos como integrados como lo son int o str.

Por último, este proporciona algunas clases de utilidad y funciones adicionales relacionadas con tipos que no son lo suficientemente fundamentales como para ser integradas.

Creación dinámica de tipos

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

Crea un objeto de clase dinámicamente utilizando la metaclase adecuada.

Los tres primeros argumentos son los componentes que componen un encabezado de definición de clase: el nombre de la clase, las clases base (en orden), los argumentos por palabra clave (tal como metaclass).

El argumento exec_body es una retrollamada que se usa para rellenar el espacio de nombres de clase recién creado. Debe aceptar el espacio de nombre de clase como su único argumento y actualizar el espacio de nombres directamente con el contenido de la clase. Si no se proporciona ninguna retrollamada, tiene el mismo efecto que pasar lambda ns: None.

Nuevo en la versión 3.3.

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

Calcula la metaclase adecuada y crea el espacio de nombre de clase.

Los argumentos son los componentes que constituyen un encabezado de definición de clase: el nombre de la clase, las clases base (en orden) y los argumentos de palabra clave (como metaclass).

El valor retornado es una tupla de 3: metaclass, namespace, kwds

metaclass es la metaclase adecuada, namespace es el espacio de nombre de clase preparado y kwds es una copia actualizada del pasado en el argumento kwds con cualquier entrada 'metaclass' eliminada. Si no se pasa ningún argumento kwds, será un diccionario vacío.

Nuevo en la versión 3.3.

Distinto en la versión 3.6: El valor predeterminado para el elemento namespace de la tupla retornada ha cambiado. Ahora una asignación de inserción-orden-conservación es utilizada cuando la metaclase no tiene un método __prepare__.

Ver también

Metaclases

Detalles completos del proceso de creación de clases soportado por estas funciones

PEP 3115 - Metaclases en Python 3000

Se presenta el hook de espacio de nombres __prepare__

types.resolve_bases(bases)

Resuelve las entradas MRO dinámicamente según lo especificado por PEP 560.

This function looks for items in bases that are not instances of type, and returns a tuple where each such object that has an __mro_entries__() method is replaced with an unpacked result of calling this method. If a bases item is an instance of type, or it doesn’t have an __mro_entries__() method, then it is included in the return tuple unchanged.

Nuevo en la versión 3.7.

types.get_original_bases(cls, /)

Return the tuple of objects originally given as the bases of cls before the __mro_entries__() method has been called on any bases (following the mechanisms laid out in PEP 560). This is useful for introspecting Generics.

For classes that have an __orig_bases__ attribute, this function returns the value of cls.__orig_bases__. For classes without the __orig_bases__ attribute, cls.__bases__ is returned.

Examples:

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

Nuevo en la versión 3.12.

Ver también

PEP 560 - Soporte principal para módulos de tipo y tipos genéricos

Tipos de Intérpretes Estándar

Este módulo proporciona nombres para muchos de los tipos necesarios para implementar un intérprete de Python. Esto evita deliberadamente incluir algunos de los tipos que surgen sólo accidentalmente durante el procesamiento, tal como el tipo listiterator.

El uso típico de estos nombres es para verificar isinstance() o issubclass().

Si se crea una instancia de cualquiera de estos tipos, tenga en cuenta que las firmas pueden variar entre las versiones de Python.

Los nombres estándar son definidos para los siguientes tipos:

types.NoneType

El tipo de None.

Nuevo en la versión 3.10.

types.FunctionType
types.LambdaType

El tipo de funciones definidas por el usuario y funciones creadas por expresiones lambda.

Lanza un auditing event function.__new__ con el argumento code.

El evento auditor solo ocurre para la instanciación directa de objetos de código y no se genera para la compilación normal.

types.GeneratorType

El tipo de iterador generator de objetos, creados por funciones generadoras.

types.CoroutineType

El tipo de objetos coroutine, creados por funciones async def.

Nuevo en la versión 3.5.

types.AsyncGeneratorType

El tipo de iterador asynchronous generator de objetos, creados por funciones generadoras asíncronas.

Nuevo en la versión 3.6.

class types.CodeType(**kwargs)

The type of code objects such as returned by compile().

Lanza un evento auditor code.__new__ con los argumentos code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

Tenga en cuenta que los argumentos auditados pueden no coincidir con los nombres o posiciones requeridos por el inicializador. El evento auditor solo ocurre para la instanciación directa de objetos de código y no se genera para la compilación normal.

types.CellType

El tipo de objetos de celda: estos objetos se utilizan como contenedores para las variables libres de una función.

Nuevo en la versión 3.8.

types.MethodType

El tipo de métodos de instancias de clase definidas por el usuario.

types.BuiltinFunctionType
types.BuiltinMethodType

El tipo de funciones integradas como len() o sys.exit() y métodos de clases integradas. (Aquí, el término «incorporado» significa «escrito en C».)

types.WrapperDescriptorType

El tipo de métodos de algunos tipos de datos integrados y clases base como object.__init__() o object.__lt__().

Nuevo en la versión 3.7.

types.MethodWrapperType

El tipo de métodos bound de algunos tipos de datos integrados y clases base. Por ejemplo, es el tipo de object().__str__.

Nuevo en la versión 3.7.

types.NotImplementedType

El tipo de NotImplemented.

Nuevo en la versión 3.10.

types.MethodDescriptorType

El tipo de métodos de algunos tipos de datos integrados como str.join().

Nuevo en la versión 3.7.

types.ClassMethodDescriptorType

El tipo de métodos de clase unbound de algunos tipos de datos integrados como dict.__dict__['fromkeys'].

Nuevo en la versión 3.7.

class types.ModuleType(name, doc=None)

El tipo de módulos. El constructor toma el nombre del módulo que se va a crear y de forma opcional su docstring.

Nota

Utilice importlib.util.module_from_spec() para crear un nuevo módulo si desea establecer los diversos atributos controlados por importación.

__doc__

El docstring del módulo. El valor predeterminado es None.

__loader__

El loader que cargó el módulo. El valor predeterminado es None.

This attribute is to match importlib.machinery.ModuleSpec.loader as stored in the __spec__ object.

Nota

Una futura versión de Python puede dejar de establecer este atributo por defecto. Para cuidarse de este cambio potencial, lea preferiblemente del atributo __spec__ en su lugar o use getattr(module, "__loader__", None) si explícitamente necesita usar este atributo.

Distinto en la versión 3.4: El valor predeterminado es None. Anteriormente el atributo era opcional.

__name__

El nombre del módulo. Se espera que coincida con importlib.machinery.ModuleSpec.name.

__package__

A cuál package pertenece un módulo. Si el módulo es de nivel superior (es decir, no una parte de algún paquete específico), el atributo debe establecerse en '', de lo contrario debe establecerse en el nombre del paquete (el cual puede ser __name__ si el módulo es un paquete). El valor predeterminado es None.

This attribute is to match importlib.machinery.ModuleSpec.parent as stored in the __spec__ object.

Nota

Una futura versión de Python puede dejar de establecer este atributo por defecto. Para cuidarse de este cambio potencial, lea preferiblemente del atributo __spec__ en su lugar o use getattr(module, "__package__", None) si explícitamente necesita usar este atributo.

Distinto en la versión 3.4: El valor predeterminado es None. Anteriormente el atributo era opcional.

__spec__

Un registro del estado relacionado con el sistema de importación del módulo. Se espera que sea una instancia de importlib.machinery.ModuleSpec.

Nuevo en la versión 3.4.

types.EllipsisType

El tipo de Ellipsis.

Nuevo en la versión 3.10.

class types.GenericAlias(t_origin, t_args)

El tipo de parameterized generics como list[int].

t_origin debería ser una clase genérica no parametrizada, como list, tuple o dict. t_args debe ser una tuple (posiblemente de longitud 1) de tipos que parametriza t_origin:

>>> from types import GenericAlias

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

Nuevo en la versión 3.9.

Distinto en la versión 3.9.2: Este tipo ahora puede heredarse.

Ver también

Generic Alias Types

In-depth documentation on instances of types.GenericAlias

PEP 585 - Type Hinting Generics In Standard Collections

Introducing the types.GenericAlias class

class types.UnionType

El tipo de union type expressions.

Nuevo en la versión 3.10.

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

The type of traceback objects such as found in sys.exception().__traceback__.

Consulte la referencia de lenguaje para obtener detalles de los atributos y operaciones disponibles, y orientación sobre cómo crear tracebacks dinámicamente.

types.FrameType

The type of frame objects such as found in tb.tb_frame if tb is a traceback object.

types.GetSetDescriptorType

The type of objects defined in extension modules with PyGetSetDef, such as FrameType.f_locals or array.array.typecode. This type is used as descriptor for object attributes; it has the same purpose as the property type, but for classes defined in extension modules.

types.MemberDescriptorType

El tipo de objetos definidos en módulos de extensión con PyMemberDef, como datetime.timedelta.days. Este tipo se utiliza como descriptor para miembros de datos C simples que utilizan funciones de conversión estándar; tiene el mismo propósito que el tipo property, pero para las clases definidas en los módulos de extensión.

In addition, when a class is defined with a __slots__ attribute, then for each slot, an instance of MemberDescriptorType will be added as an attribute on the class. This allows the slot to appear in the class’s __dict__.

Detalles de implementación de CPython: En otras implementaciones de Python, este tipo puede ser idéntico a GetSetDescriptorType.

class types.MappingProxyType(mapping)

Proxy de solo lectura de un mapeo. Proporciona una vista dinámica en las entradas de la asignación, lo que significa que cuando cambia la asignación, la vista refleja estos cambios.

Nuevo en la versión 3.3.

Distinto en la versión 3.9: Actualizado para soportar el nuevo operador de unión (|) de PEP 584, que simplemente delega al mapeo subyacente.

key in proxy

Retorna True si la asignación subyacente tiene una clave key, de lo contrario False.

proxy[key]

Retorna el elemento de la asignación subyacente con la clave key. Lanza un KeyError si key no está en la asignación subyacente.

iter(proxy)

Retorna un iterador sobre las claves de la asignación subyacente. Este es un método abreviado para iter(proxy.keys()).

len(proxy)

Retorna el número de elementos de la asignación subyacente.

copy()

Retorna una copia superficial de la asignación subyacente.

get(key[, default])

Retorna el valor de key si key está en la asignación subyacente, de lo contrario default. Si no se proporciona default, el valor predeterminado es None, por lo que este método nunca lanza un KeyError.

items()

Retorna una nueva vista de los elementos de la asignación subyacente (en pares (key, value)).

keys()

Retorna una nueva vista de las claves de la asignación subyacente.

values()

Retorna una nueva vista de los valores de la asignación subyacente.

reversed(proxy)

Retorna un iterador inverso sobre las claves de la asignación subyacente.

Nuevo en la versión 3.9.

hash(proxy)

Return a hash of the underlying mapping.

Nuevo en la versión 3.12.

class types.CapsuleType

The type of capsule objects.

Nuevo en la versión 3.13.

Clases y funciones de utilidad adicionales

class types.SimpleNamespace

Una subclase simple object que proporciona acceso de atributo a su espacio de nombre, así como una representación significativa.

A diferencia de object, con SimpleNamespace puede agregar y eliminar atributos. Si un objeto SimpleNamespace se inicializa con argumentos de palabra clave, estos se agregan directamente al espacio de nombres subyacente.

El tipo es aproximadamente equivalente al código siguiente:

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        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 puede ser útil como reemplazo para class NS: pass. Sin embargo, para un tipo de registro estructurado, utilice namedtuple() en su lugar.

SimpleNamespace objects are supported by copy.replace().

Nuevo en la versión 3.3.

Distinto en la versión 3.9: El orden de los atributos en el repr cambió de alfabético a orden de inserción (como dict).

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

Acceso de atributo de ruta en una clase para __getattr__.

Se trata de un descriptor, que se utiliza para definir atributos que actúan de forma diferente cuando se accede a través de una instancia y a través de una clase. El acceso a la instancia sigue siendo normal, pero el acceso a un atributo a través de una clase se enrutará al método __getattr__ de la clase; esto se hace lanzando AttributeError.

Esto permite tener propiedades activas en una instancia y tener atributos virtuales en la clase con el mismo nombre (véase enum.Enum para obtener un ejemplo).

Nuevo en la versión 3.4.

Funciones de utilidad de corutina

types.coroutine(gen_func)

This function transforms a generator function into a coroutine function which returns a generator-based coroutine. The generator-based coroutine is still a generator iterator, but is also considered to be a coroutine object and is awaitable. However, it may not necessarily implement the __await__() method.

Si gen_func es una función generadora, se modificará en el lugar.

Si gen_func no es una función generadora, se envolverá. Si retorna una instancia de collections.abc.Generator, la instancia se ajustará en un objeto proxy awaitable. Todos los demás tipos de objetos se retornarán tal cual.

Nuevo en la versión 3.5.