types — 内置类型的动态类型创建和名称 — Python 文档

来自菜鸟教程
Python/docs/3.10/library/types
跳转至:导航、​搜索

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

源代码: :source:`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)。

返回值是一个三元组: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 版中的新功能。

也可以看看

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


标准解释器类型

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

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

如果您实例化这些类型中的任何一个,请注意签名可能因 Python 版本而异。

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

types.NoneType

的类型。

3.10 版中的新功能。

types.FunctionType
types.LambdaType

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

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

types.GeneratorType
generator-iterator 对象的类型,由生成器函数创建。
types.CoroutineType

coroutine 对象的类型,由 async def 函数创建。

3.5 版中的新功能。

types.AsyncGeneratorType

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

3.6 版中的新功能。

class types.CodeType(**kwargs)

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

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

replace(**kwargs)

返回具有指定字段的新值的代码对象的副本。

3.8 版中的新功能。

types.CellType

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

3.8 版中的新功能。

types.MethodType
用户自定义类实例的方法类型。
types.BuiltinFunctionType

types.BuiltinMethodType

len()sys.exit() 等内置函数的类型,以及内置类的方法。 (这里,术语“内置”的意思是“用 C 编写的”。)
types.WrapperDescriptorType

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

3.7 版中的新功能。

types.MethodWrapperType

一些内置数据类型和基类的 bound 方法的类型。 例如它是object().__str__的类型。

3.7 版中的新功能。

types.NotImplementedType

NotImplemented 的类型。

3.10 版中的新功能。

types.MethodDescriptorType

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

3.7 版中的新功能。

types.ClassMethodDescriptorType

unbound 一些内置数据类型如 dict.__dict__['fromkeys'] 类方法的类型。

3.7 版中的新功能。

class types.ModuleType(name, doc=None)

模块的类型。 构造函数采用要创建的模块的名称以及可选的 docstring

笔记

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

__doc__

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

__loader__

加载模块的 loader。 默认为 None

该属性用于匹配存储在 attr:__spec__ 对象中的 importlib.machinery.ModuleSpec.loader

笔记

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

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

__name__

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

__package__

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

该属性用于匹配存储在 attr:__spec__ 对象中的 importlib.machinery.ModuleSpec.parent

笔记

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

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

__spec__

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

3.4 版中的新功能。

types.EllipsisType

省略号的类型。

3.10 版中的新功能。

class types.GenericAlias(t_origin, t_args)

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

t_origin 应该是非参数化的泛型类,例如 listtupledictt_args 应该是参数化 t_origin 类型的 元组 (可能长度为 1):

>>> from types import GenericAlias

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

3.9 版中的新功能。

3.9.2 版本更改: 现在可以对这种类型进行子类化。

types.UnionType

联合类型表达式的类型。

3.10 版中的新功能。

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

回溯对象的类型,例如在 sys.exc_info()[2] 中找到。

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

types.FrameType

如果 tb 是回溯对象,则在 tb.tb_frame 中找到的框架对象的类型。

有关可用属性和操作的详细信息,请参阅 语言参考

types.GetSetDescriptorType
扩展模块中定义的对象类型,带有 PyGetSetDef,例如 FrameType.f_localsarray.array.typecode。 该类型用作对象属性的描述符; 它与 property 类型具有相同的用途,但用于扩展模块中定义的类。
types.MemberDescriptorType
扩展模块中定义的对象类型为PyMemberDef,如datetime.timedelta.days。 此类型用作使用标准转换函数的简单 C 数据成员的描述符; 它与 property 类型具有相同的用途,但用于扩展模块中定义的类。
class types.MappingProxyType(mapping)

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

3.3 版中的新功能。

3.9 版更改: 更新以支持来自 PEP 584 的新联合 (|) 运算符,它只是委托给底层映射。

key in proxy

如果底层映射具有键 ,则返回 True,否则返回 False

proxy[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 版中的新功能。


附加实用程序类和函数

class types.SimpleNamespace

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

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)

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

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

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

3.5 版中的新功能。