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

源代码: Lib/types.py


此模块定义实用程序函数以帮助动态创建新类型。

它还为标准的python解释器使用的一些对象类型定义名称,但不作为内置的 intstr 是。

最后,它提供了一些额外的与类型相关的实用程序类和函数,这些类和函数不够基本,不能内置。

动态类型创建

types.new_class(name, bases=(), kwds=None, exec_body=None)

使用适当的元类动态创建类对象。

前三个参数是组成类定义头的组件:类名、基类(按顺序)、关键字参数(如 metaclass

这个 exec_body 参数是用于填充新创建的类命名空间的回调。它应该接受类名称空间作为它的唯一参数,并直接用类内容更新名称空间。如果没有提供回调,则其效果与传入相同 lambda ns: ns .

3.3 新版功能.

types.prepare_class(name, bases=(), kwds=None)

计算适当的元类并创建类命名空间。

参数是构成类定义头的组件:类名、基类(按顺序)和关键字参数(如 metaclass

返回值是3元组: metaclass, namespace, kwds

元类 是适当的元类, 命名空间 是准备好的类命名空间和 kwds 是传入的更新副本 kwds 与任何 'metaclass' 删除条目。如果没有 kwds 参数已传入,这将是一个空的dict。

3.3 新版功能.

在 3.6 版更改: 的默认值 namespace 返回的元组的元素已更改。现在,当元类没有 __prepare__ 方法。

参见

元类

这些函数支持的类创建过程的完整详细信息

PEP 3115 -python 3000中的元类

介绍了 __prepare__ 命名空间钩子

types.resolve_bases(bases)

根据指定动态解析MRO条目 PEP 560 .

此函数查找 这不是 type ,并返回一个元组,其中每个这样的对象 __mro_entries__ 方法替换为调用此方法的解包结果。如果A 项是的实例 type 或者它没有 __mro_entries__ 方法,然后将其包含在未更改的返回元组中。

3.7 新版功能.

参见

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

标准解释程序类型

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

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

如果您实例化这些类型中的任何一个,请注意,签名可能在不同的Python版本之间有所不同。

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

types.NoneType

的类型 None .

3.10 新版功能.

types.FunctionType
types.LambdaType

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

引发一个 auditing event function.__new__ 带着论点 code

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

types.GeneratorType

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

types.CoroutineType

的类型 coroutine 对象,由创建 async def 功能。

3.5 新版功能.

types.AsyncGeneratorType

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

3.6 新版功能.

class types.CodeType(**kwargs)

代码对象的类型,如返回者 compile() .

提出一个 auditing event code.__new__ 带着论据 codefilenamenameargcountposonlyargcountkwonlyargcountnlocalsstacksizeflags .

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

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

的类型 跳跃 一些内置数据类型和基类的方法。例如,它是 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)

的类型 modules . 构造函数采用要创建的模块的名称,并且可以选择 docstring .

注解

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

__doc__

这个 docstring 模块的。默认为 None .

__loader__

这个 loader 加载了模块。默认为 None .

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

__name__

模块的名称。

__package__

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

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

types.EllipsisType

的类型 Ellipsis .

3.10 新版功能.

class types.GenericAlias(t_origin, t_args)

的类型 parameterized generics 比如 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.Union

的类型 union type expressions

3.10 新版功能.

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

回溯对象的类型,如 sys.exc_info()[2] .

the language reference 有关可用属性和操作的详细信息,以及有关动态创建回溯的指导。

types.FrameType

框架对象的类型,如 tb.tb_frame 如果 tb 是一个回溯对象。

the language reference 有关可用属性和操作的详细信息。

types.GetSetDescriptorType

在扩展模块中定义的对象类型 PyGetSetDef ,如 FrameType.f_localsarray.array.typecode .此类型用作对象属性的描述符;其用途与 property 类型,但用于扩展模块中定义的类。

types.MemberDescriptorType

在扩展模块中定义的对象类型 PyMemberDef ,如 datetime.timedelta.days .此类型用作使用标准转换函数的简单C数据成员的描述符;它与 property 类型,但用于扩展模块中定义的类。

CPython implementation detail: 在Python的其他实现中,此类型可能与 GetSetDescriptorType .

class types.MappingProxyType(mapping)

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

3.3 新版功能.

在 3.9 版更改: 更新以支持新联盟 (| )接线员来自 PEP 584 ,它只委托给底层映射。

key in proxy

返回 True 如果基础映射具有键 key ,否则 False .

proxy[key]

用键返回基础映射的项 key .提高 KeyError 如果 key 不在基础映射中。

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 提供对其命名空间的属性访问的子类,以及有意义的repr。

不像 objectSimpleNamespace 您可以添加和删除属性。如果A 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 函数转换成 coroutine function 它返回基于生成器的协同程序。基于生成器的协程仍然是一个 generator iterator ,但也被认为是 coroutine 对象和IS awaitable . 但是,它可能不一定实现 __await__() 方法。

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

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

3.5 新版功能.