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

在对任何基类调用 __mro_entries__() 方法之前(按照 PEP 560 中规定的机制),返回最初作为 cls 的基类的对象元组。这对于内省 泛型 很有用。

对于具有 __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() 返回的对象。

引发带有参数 codefilenamenameargcountposonlyargcountkwonlyargcountnlocalsstacksizeflags审计事件 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)

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

注意

如果要设置各种导入控制的属性,请使用 importlib.util.module_from_spec() 创建新模块。

__doc__

模块的 文档字符串。默认为 None

__loader__

加载模块的 加载器。默认为 None

此属性与存储在 __spec__ 对象中的 importlib.machinery.ModuleSpec.loader 相匹配。

注意

未来版本的 Python 可能默认情况下会停止设置此属性。为了防止这种潜在的变化,最好从 __spec__ 属性中读取,或者如果需要显式使用此属性,请使用 getattr(module, "__loader__", None)

在 3.4 版更改: 默认为 None。以前该属性是可选的。

__name__

模块的名称。预期与 importlib.machinery.ModuleSpec.name 相匹配。

__package__

模块所属的 。如果模块是顶级模块(即不属于任何特定包),则该属性应设置为 '',否则应设置为包的名称(如果模块本身就是一个包,则可以是 __name__)。默认为 None

此属性与存储在 __spec__ 对象中的 importlib.machinery.ModuleSpec.parent 相匹配。

注意

未来版本的 Python 可能会停止默认设置此属性。为了防止这种潜在的变化,最好从 __spec__ 属性读取,或者如果您明确需要使用此属性,请使用 getattr(module, "__package__", None)

在 3.4 版更改: 默认为 None。以前该属性是可选的。

__spec__

模块导入系统相关状态的记录。预期为 importlib.machinery.ModuleSpec 的实例。

3.4 版新增。

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

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

object 不同,使用 SimpleNamespace 可以添加和删除属性。如果使用关键字参数初始化 SimpleNamespace 对象,则这些参数将直接添加到底层命名空间。

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

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

3.3 版新增。

在版本 3.9 中更改: repr 中的属性顺序从字母顺序更改为插入顺序(类似于 dict)。

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

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

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

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

3.4 版新增。

协程实用函数

types.coroutine(gen_func)

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

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

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

版本 3.5 中的新功能。