types
— 内置类型的动态类型创建和命名¶
源代码: Lib/types.py
此模块定义了用于辅助动态创建新类型的实用函数。
它还定义了标准 Python 解释器使用但未作为 int
或 str
等内置类型公开的一些对象类型的名称。
最后,它提供了一些额外的与类型相关的实用类和函数,这些类和函数不够基础,无法成为内置类型。
动态类型创建¶
- 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__
方法时,使用保留插入顺序的映射。
- 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.FunctionType¶
- types.LambdaType¶
用户定义函数和由
lambda
表达式创建的函数的类型。引发 审计事件
function.__new__
,参数为code
。审计事件仅在直接实例化函数对象时发生,而不会在正常编译时引发。
- class types.CodeType(**kwargs)¶
代码对象 的类型,例如由
compile()
返回的代码对象。引发 审计事件
code.__new__
,参数为code
,filename
,name
,argcount
,posonlyargcount
,kwonlyargcount
,nlocals
,stacksize
,flags
。请注意,审计的参数可能与初始化器所需的名称或位置不匹配。审计事件仅在直接实例化代码对象时发生,而不会在正常编译时引发。
- 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
实例,确保各种属性都设置得当。
- class types.GenericAlias(t_origin, t_args)¶
参数化泛型 的类型,例如
list[int]
。t_origin
应该是一个非参数化的泛型类,例如list
、tuple
或dict
。t_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 版本发生变化: 此类型现在可以被子类化。
- 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_locals
或array.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
对象可以像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.coroutine(gen_func)¶
此函数将 生成器 函数转换为 协程函数,该函数返回一个基于生成器的协程。基于生成器的协程仍然是一个 生成器迭代器,但也被视为一个 协程 对象,并且是 可等待的。但是,它可能不一定实现
__await__()
方法。如果 gen_func 是一个生成器函数,它将原地修改。
如果 gen_func 不是生成器函数,它将被包装。如果它返回
collections.abc.Generator
的实例,该实例将被包装在一个 *awaitable* 代理对象中。所有其他类型的对象将原样返回。在 3.5 版本加入。