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, /)¶
在对任何基类调用
__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.FunctionType¶
- types.LambdaType¶
用户定义函数和由
lambda
表达式创建的函数的类型。引发带有参数
code
的 审计事件function.__new__
。审计事件仅在函数对象的直接实例化时发生,并且不会在正常编译时引发。
- class types.CodeType(**kwargs)¶
-
引发带有参数
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)¶
模块 的类型。构造函数接受要创建的模块的名称及其可选的 文档字符串。
注意
如果要设置各种导入控制的属性,请使用
importlib.util.module_from_spec()
创建新模块。- __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 版新增。
- 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.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
对象,则这些参数将直接添加到底层命名空间。该类型大致等效于以下代码
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.coroutine(gen_func)¶
此函数将 生成器 函数转换为 协程函数,该函数返回一个基于生成器的协程。基于生成器的协程仍然是一个 生成器迭代器,但也 considered to be a 协程 对象,并且是 可等待的。但是,它可能不一定实现
__await__()
方法。如果 *gen_func* 是一个生成器函数,它将被就地修改。
如果 *gen_func* 不是一个生成器函数,它将被包装。如果它返回一个
collections.abc.Generator
的实例,该实例将被包装在一个 *可等待的* 代理对象中。所有其他类型的对象将按原样返回。版本 3.5 中的新功能。