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 表达式创建的函数的类型。

使用参数 code 引发 审计事件 function.__new__

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

types.GeneratorType

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

types.CoroutineType

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

3.5 版本中新增。

types.AsyncGeneratorType

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

3.6 版本新增。

class types.CodeType(**kwargs)

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

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

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

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 版本中新增。

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

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

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

types.FrameType

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

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 版本中新增。