types — 内置类型的动态类型创建和命名

源代码: Lib/types.py


此模块定义了用于辅助动态创建新类型的实用函数。

它还定义了标准 Python 解释器使用但未作为 intstr 等内置类型公开的一些对象类型的名称。

最后,它提供了一些额外的与类型相关的实用类和函数,这些类和函数不够基础,无法成为内置类型。

动态类型创建

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

使用适当的元类动态创建一个类对象。

前三个参数是构成类定义头部的组件:类名、基类(按顺序)和关键字参数(例如 metaclass)。

exec_body 参数是一个回调函数,用于填充新创建的类命名空间。它应该接受类命名空间作为其唯一参数,并直接使用类内容更新命名空间。如果没有提供回调函数,则效果与传入 lambda ns: None 相同。

在 3.3 版本加入。

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

计算适当的元类并创建类命名空间。

参数是构成类定义头部的组件:类名、基类(按顺序)和关键字参数(例如 metaclass)。

返回值为一个 3 元组:metaclass, namespace, kwds

metaclass 是适当的元类,namespace 是准备好的类命名空间,而 kwds 是传入的 kwds 参数的更新副本,其中删除了任何 'metaclass' 条目。如果没有传入 kwds 参数,则这将是一个空字典。

在 3.3 版本加入。

3.6 版本发生变化: 返回元组的 namespace 元素的默认值已更改。现在当元类没有 __prepare__ 方法时,使用保留插入顺序的映射。

参见

元类

这些函数支持的类创建过程的完整详细信息

PEP 3115 - Python 3000 中的元类

引入了 __prepare__ 命名空间钩子

types.resolve_bases(bases)

根据 PEP 560 的规定动态解析 MRO 条目。

此函数查找 bases 中不是 type 实例的项,并返回一个元组,其中每个具有 __mro_entries__() 方法的对象都替换为调用此方法解包的结果。如果 bases 项是 type 的实例,或者它没有 __mro_entries__() 方法,则它将原样包含在返回的元组中。

在 3.7 版本加入。

types.get_original_bases(cls, /)

返回最初作为 cls 的基类提供的对象元组,在此之前任何基类都没有调用 __mro_entries__() 方法(遵循 PEP 560 中规定的机制)。这对于自省 泛型 很有用。

对于具有 __orig_bases__ 属性的类,此函数返回 cls.__orig_bases__ 的值。对于没有 __orig_bases__ 属性的类,则返回 cls.__bases__

示例:

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

3.12 新版功能.

参见

PEP 560 - 对类型模块和泛型类型的核心支持

标准解释器类型

此模块为实现 Python 解释器所需的许多类型提供了名称。它特意避免包含一些在处理过程中偶然出现的类型,例如 listiterator 类型。

这些名称的典型用法是用于 isinstance()issubclass() 检查。

如果您实例化任何这些类型,请注意签名可能在 Python 版本之间有所不同。

为以下类型定义了标准名称

types.NoneType

None 的类型。

在 3.10 版本加入。

types.FunctionType
types.LambdaType

用户定义函数和由 lambda 表达式创建的函数的类型。

引发 审计事件 function.__new__,参数为 code

审计事件仅在直接实例化函数对象时发生,而不会在正常编译时引发。

types.GeneratorType

由生成器函数创建的 生成器-迭代器对象的类型。

types.CoroutineType

async def 函数创建的 协程 对象的类型。

在 3.5 版本加入。

types.AsyncGeneratorType

由异步生成器函数创建的 异步生成器-迭代器对象的类型。

在 3.6 版本加入。

class types.CodeType(**kwargs)

代码对象 的类型,例如由 compile() 返回的代码对象。

引发 审计事件 code.__new__,参数为 code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags

请注意,审计的参数可能与初始化器所需的名称或位置不匹配。审计事件仅在直接实例化代码对象时发生,而不会在正常编译时引发。

types.CellType

单元格对象的类型:此类对象用作函数的 闭包变量 的容器。

在 3.8 版本加入。

types.MethodType

用户定义类实例的方法的类型。

types.BuiltinFunctionType
types.BuiltinMethodType

len()sys.exit() 这样的内置函数的类型,以及内置类的方法。(这里,“内置”指的是“用 C 语言编写”)。

types.WrapperDescriptorType

某些内置数据类型和基类(例如 object.__init__()object.__lt__())的方法的类型。

在 3.7 版本加入。

types.MethodWrapperType

某些内置数据类型和基类的 *绑定* 方法的类型。例如,它是 object().__str__ 的类型。

在 3.7 版本加入。

types.NotImplementedType

NotImplemented 的类型。

在 3.10 版本加入。

types.MethodDescriptorType

某些内置数据类型的方法的类型,例如 str.join()

在 3.7 版本加入。

types.ClassMethodDescriptorType

某些内置数据类型的 *未绑定* 类方法的类型,例如 dict.__dict__['fromkeys']

在 3.7 版本加入。

class types.ModuleType(name, doc=None)

模块 的类型。构造函数接受要创建的模块的名称和可选的 文档字符串

参见

模块对象文档

提供了 ModuleType 实例上可找到的特殊属性的详细信息。

importlib.util.module_from_spec()

使用 ModuleType 构造函数创建的模块,其许多特殊属性未设置或设置为默认值。module_from_spec() 提供了一种更可靠的方法来创建 ModuleType 实例,确保各种属性都设置得当。

types.EllipsisType

Ellipsis 的类型。

在 3.10 版本加入。

class types.GenericAlias(t_origin, t_args)

参数化泛型 的类型,例如 list[int]

t_origin 应该是一个非参数化的泛型类,例如 listtupledictt_args 应该是一个 tuple(可能长度为 1)的类型,这些类型对 t_origin 进行参数化。

>>> from types import GenericAlias

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

在 3.9 版本中新增。

3.9.2 版本发生变化: 此类型现在可以被子类化。

参见

泛型别名类型

有关 types.GenericAlias 实例的深入文档

PEP 585 - 标准集合中的类型提示泛型

引入 types.GenericAlias

class types.UnionType

联合类型表达式 的类型。

在 3.10 版本加入。

3.14 版本发生变化: 这现在是 typing.Union 的别名。

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

回溯对象的类型,例如在 sys.exception().__traceback__ 中找到的类型。

有关可用属性和操作的详细信息以及动态创建回溯的指南,请参见语言参考

types.FrameType

帧对象 的类型,例如如果 tb 是一个回溯对象,则在 tb.tb_frame 中找到的类型。

types.GetSetDescriptorType

在扩展模块中用 PyGetSetDef 定义的对象的类型,例如 FrameType.f_localsarray.array.typecode。此类型用作对象属性的描述符;它具有与 property 类型相同的目的,但适用于在扩展模块中定义的类。

types.MemberDescriptorType

在扩展模块中用 PyMemberDef 定义的对象的类型,例如 datetime.timedelta.days。此类型用作使用标准转换函数的简单 C 数据成员的描述符;它具有与 property 类型相同的目的,但适用于在扩展模块中定义的类。

此外,当使用 __slots__ 属性定义类时,对于每个槽位,一个 MemberDescriptorType 实例将作为类的属性添加。这允许槽位出现在类的 __dict__ 中。

CPython 实现细节: 在 Python 的其他实现中,此类型可能与 GetSetDescriptorType 相同。

class types.MappingProxyType(mapping)

映射的只读代理。它提供了一个映射条目的动态视图,这意味着当映射更改时,视图会反映这些更改。

在 3.3 版本加入。

3.9 版本发生变化: 已更新以支持 PEP 584 中的新联合 (|) 运算符,它只是委托给底层映射。

key in proxy

如果底层映射包含键 key,则返回 True,否则返回 False

proxy[key]

返回底层映射中键为 key 的项。如果 key 不在底层映射中,则引发 KeyError

iter(proxy)

返回底层映射键的迭代器。这是 iter(proxy.keys()) 的快捷方式。

len(proxy)

返回底层映射中的项数。

copy()

返回底层映射的浅拷贝。

get(key[, default])

如果 key 在底层映射中,则返回 key 对应的值,否则返回 default。如果未给出 default,则默认为 None,因此此方法永远不会引发 KeyError

items()

返回底层映射项((key, value) 对)的新视图。

keys()

返回底层映射键的新视图。

values()

返回底层映射值的新视图。

reversed(proxy)

返回底层映射键的反向迭代器。

在 3.9 版本中新增。

hash(proxy)

返回底层映射的哈希值。

3.12 新版功能.

class types.CapsuleType

胶囊对象 的类型。

在 3.13 版本加入。

额外的实用类和函数

class types.SimpleNamespace

object 的一个简单子类,提供对其命名空间的属性访问,以及有意义的 repr。

object 不同,使用 SimpleNamespace 可以添加和删除属性。

SimpleNamespace 对象可以像 dict 一样初始化:既可以通过关键字参数,也可以通过单个位置参数,或者两者兼有。当使用关键字参数初始化时,这些参数会直接添加到底层命名空间。或者,当使用位置参数初始化时,底层命名空间将使用该参数中的键值对进行更新(可以是映射对象或生成键值对的 可迭代 对象)。所有此类键都必须是字符串。

该类型大致等同于以下代码

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 可用作 class NS: pass 的替代品。但是,对于结构化记录类型,请改用 namedtuple()

SimpleNamespace 对象受 copy.replace() 支持。

在 3.3 版本加入。

3.9 版本发生变化: repr 中的属性顺序从字母顺序更改为插入顺序(如 dict)。

3.13 版本发生变化: 增加了对可选位置参数的支持。

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

将类上的属性访问路由到 __getattr__。

这是一个描述符,用于定义通过实例和通过类访问时行为不同的属性。实例访问保持正常,但通过类访问属性将路由到类的 __getattr__ 方法;这是通过引发 AttributeError 来完成的。

这允许在实例上激活属性,并在类上具有相同名称的虚拟属性(请参阅 enum.Enum 获取示例)。

在 3.4 版本加入。

协程实用函数

types.coroutine(gen_func)

此函数将 生成器 函数转换为 协程函数,该函数返回一个基于生成器的协程。基于生成器的协程仍然是一个 生成器迭代器,但也被视为一个 协程 对象,并且是 可等待的。但是,它可能不一定实现 __await__() 方法。

如果 gen_func 是一个生成器函数,它将原地修改。

如果 gen_func 不是生成器函数,它将被包装。如果它返回 collections.abc.Generator 的实例,该实例将被包装在一个 *awaitable* 代理对象中。所有其他类型的对象将原样返回。

在 3.5 版本加入。