"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**.

   Esta función busca elementos en *bases* que no son instancias de
   "type" y retorna una tupla donde cada uno de estos objetos que
   tiene un método "__mro_entries__" se reemplaza con un resultado
   desempaquetado de llamar a este método.  Si un elemento *bases* es
   una instancia de "type" o no tiene un método "__mro_entries__", se
   incluye en el retorno la tupla sin cambios.

   Nuevo en la versión 3.7.

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)

   El tipo de objetos de código cómo los retornados por "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.

   replace(**kwargs)

      Retorna una copia del objeto de código con nuevos valores para
      los campos especificados.

      Nuevo en la versión 3.8.

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.

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)

   El tipo de objetos *traceback* tal como los encontrados en
   "sys.exc_info()[2]".

   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

   El tipo de objetos de marco como se encuentra en "tb.tb_frame" si
   "tb" es un objeto *traceback*.

   Consulte la referencia de lenguaje para obtener más información
   sobre los atributos y operaciones disponibles.

types.GetSetDescriptorType

   El tipo de objetos definidos en módulos de extensión con
   "PyGetSetDef", como "FrameType.f_locals" o "array.array.typecode".
   Este tipo se utiliza como descriptor para los atributos de objeto;
   tiene el mismo propósito que el tipo "property", pero para las
   clases definidas en los módulos de extensión.

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.

   **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.


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.

   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.
