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

news2024/5/19 22:49:48

目录

动态类型创建

标准解释器类型

附加工具类和函数

协程工具函数


源代码: Lib/types.py


此模块定义了一些工具函数,用于协助动态创建新的类型。

它还为某些对象类型定义了名称,这些名称由标准 Python 解释器所使用,但并不像内置的 int 或 str 那样对外公开。

最后,它还额外提供了一些类型相关但重要程度不足以作为内置对象的工具类和函数。

动态类型创建

types.new_class(namebases=()kwds=Noneexec_body=None)

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

前三个参数是组成类定义头的部件:类名称,基类 (有序排列),关键字参数 (例如 metaclass)。

exec_body 参数是一个回调函数,用于填充新创建类的命名空间。 它应当接受类命名空间作为其唯一的参数并使用类内容直接更新命名空间。 如果未提供回调函数,则它就等效于传入 lambda ns: None

3.3 新版功能.

types.prepare_class(namebases=()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)

动态地解析 MRO 条目,具体描述见 PEP 560。

此函数会在 bases 中查找不是 type 的实例的项,并返回一个元组,其中每个具有 __mro_entries__() 方法的此种对象将被替换为调用该方法解包后的结果。 如果一个 bases 项是 type 的实例,或它不具有 __mro_entries__() 方法 ,则它将不加改变地被包括在返回的元组中。

3.7 新版功能.

types.get_original_bases(cls/)

在 __mro_entries__() 方法在任何基类上被调用之前返回最初是作为 cls 的基类给出的对象元组(根据 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 - 对 typing 模块和泛型类型的核心支持

标准解释器类型

此模块为许多类型提供了实现 Python 解释器所要求的名称。 它刻意地避免了包含某些仅在处理过程中偶然出现的类型,例如 listiterator 类型。

此种名称的典型应用如 isinstance() 或 issubclass() 检测。

如果你要实例化这些类型中的任何一种,请注意其签名在不同 Python 版本之间可能出现变化。

以下类型有相应的标准名称定义:

types.NoneType

None 的类型。

3.10 新版功能.

types.FunctionType

types.LambdaType

用户自定义函数以及由 lambda 表达式所创建函数的类型。

引发一个 审计事件 function.__new__,附带参数 code

此审计事件只会被函数对象的直接实例化引发,而不会被普通编译所引发。

types.GeneratorType

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

types.CoroutineType

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

3.5 新版功能.

types.AsyncGeneratorType

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

3.6 新版功能.

class types.CodeType(**kwargs)

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

引发 审计事件 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(namedoc=None)

模块 的类型。 构造器接受待创建模块的名称并以其 docstring 作为可选参数。

备注

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

__doc__

模块的 docstring。 默认为 None

__loader__

用于加载模块的 loader。 默认为 None

此属性会匹配保存在 __spec__ object 对象中的 importlib.machinery.ModuleSpec.loader。

备注

未来的 Python 版本可能会停止默认设置此属性。 为了避免这个潜在变化的影响,如果你明确地需要使用此属性则推荐改从 __spec__ 属性读取或是使用 getattr(module, "__loader__", None)

在 3.4 版更改: 默认为 None。 之前该属性为可选项。

__name__

模块的名称。 应当能匹配 importlib.machinery.ModuleSpec.name。

__package__

一个模块所属的 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_origint_args)

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

t_origin 应当是一个非形参化的泛型类,例如 listtuple 或 dict。 t_args 应当是一个形参化 t_origin 的 tuple (长度可以为 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.GenericAlias 实例的详细文档

PEP 585 - 标准多项集中的类型提示泛型

引入 types.GenericAlias 类

class types.UnionType

合并类型表达式 的类型。

3.10 新版功能.

class types.TracebackType(tb_nexttb_frametb_lastitb_lineno)

回溯对象的类型,如在 sys.exception().__traceback__ 中找到的一样。

请查看 语言参考 了解可用属性和操作的细节,以及动态地创建回溯对象的指南。

types.FrameType

帧对象的类型,例如 tb.tb_frame 中的对象,其中 tb 是一个回溯对象。

请查看 语言参考 了解可用属性和操作的细节。

types.GetSetDescriptorType

使用 PyGetSetDef 在扩展模块中定义的对象的类型,例如 FrameType.f_locals 或 array.array.typecode。 此类型被用作对象属性的描述器;它的目的与 property 类型相同,但专门针对在扩展模块中定义的类。

types.MemberDescriptorType

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

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()

返回由下层映射的项 ((键, 值) 对) 组成的一个新视图。

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=Nonefset=Nonefdel=Nonedoc=None)

在类上访问 __getattr__ 的路由属性。

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

这允许有在实例上激活的特性属性,同时又有在类上的同名虚拟属性 (一个例子请参见 enum.Enum)。

3.4 新版功能.

协程工具函数

types.coroutine(gen_func)

此函数可将 generator 函数转换为一个返回基于生成器的协程的 coroutine function。 基于生成器的协程仍然属于 generator iterator,但同时又可被视为 coroutine 对象兼 awaitable。 不过,它没有必要实现 __await__() 方法。

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

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

3.5 新版功能.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

向日葵远程控制鼠标异常的问题

​ 在通过向日葵进行远程控制的时候,可能会遇到鼠标位置异常的问题。此时,不管怎么移动鼠标,都会停留在屏幕最上方,而无法点击到正确的位置。如图: 此时,如果启用了“被控端鼠标”功能,可以正…

代码随想录二刷 |二叉树 |二叉树的最大深度

代码随想录二刷 |二叉树 |二叉树的最大深度 题目描述解题思路代码实现 题目描述 104.二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1:…

键盘打字盲打练习系列之矫正坐姿——4

一.欢迎来到我的酒馆 盲打,矫正坐姿! 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿1.键盘鼠标选购指南2.椅子选购指南 三.改善坐姿建议 二.继续练习 前面的章节,我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&am…

table中cellspacing、cellpadding的css替代写法

table中cellspacing、cellpadding的css替代写法 table{border:0;margin:0;border-collapse:collapse;border-spacing:0;} /*控制cellspacing*/ table td{padding:0;} /*控制cellpadding*/

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散:让AI给出时代或今日或你关注的热点事件 比如采集新闻头条,根据内容或标题,以不同的角度,或各种人群的角色,生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面,海量生成】…

C语言中实参和形参的值传递,一直都不理解

C语言中实参和形参的值传递,一直都不理解 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C语言从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&#xff01…

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式: 基本概念 单例模式:类只有一个实例,一般使用static来实现单例模式; 比如:有一个Test类,实现了单例,假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…

Flask和Vue框架实现WebSocket消息通信

1 安装环境 1.1 安装Flask环境 主要的安装包 Flask、Flask-SocketIO,注意Python版本要求3.6 # Flask-SocketIO参考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基础环境 # 更新pip python -m …

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)

软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过,真是太太太太太太太幸运了。上天对我如此眷顾,那不得不分享下我的备考过程以及一些备考资料,帮助更多小伙伴通过考试。 2.备考…

HarmonyOS4.0从零开始的开发教程10Video组件的使用

HarmonyOS(九)Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能…

jQuery中点击按钮发送多次请求

jQuery中点击按钮发送多次请求 /* 采用以下常规触发按钮去执行回调函数,可能会发送多次请求。并且会影响到数据库表 原因分析:可能是前端原型,绑定了多次事件。 */ $("#saveBtn").click(function (){$.ajax({}) }/* 解决办法如下&a…

windows下分卷解压文件

我的文件是这样的: 存放路径为:C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd: 第一步:cd /path/o/分卷问文件目录 第二步: 执行之后的结果(红色框出来的): …

基于Spring+Spring boot的SpringBoot在线电子商城管理系统

SSM毕设分享 基于SpringSpring boot的SpringBoot在线电子商城管理系统 1 项目简介 Hi,各位同学好,这里是郑师兄! 今天向大家分享一个毕业设计项目作品【基于SpringSpring boot的SpringBoot在线电子商城管理系统】 师兄根据实现的难度和等级…

装修干货,卫生间干湿分离的5个建议。福州中宅装饰,福州装修

你是否也曾为卫生间的干湿分离烦恼?小编今天就给大家带来5点建议,让你轻松解决这个问题! ①使用玻璃淋浴房 使用玻璃淋浴房是一种常见的干湿分离方法。玻璃淋浴房可以防水、防滑,而且清洁起来也比较方便。 ②使用淋浴屏风 淋浴屏…

【展望2024】,从软件测试用例开始学习起

1. 测试用例的概念 测试用例就是测试人员向被测试系统发起的一组集合,该集合包括测试环境,测试数据,测试步骤,预期结果 2. 设计测试用例的好处 在测试前都要先设计测试用例,设计测试用例有如下好处: 测…

Java数据结构《二叉排序树的插入删除和查找》(难度系数100)

一、前言: 这是怀化学院的:Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究与学习一名叫qing影的博主,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢&am…

外贸找客户软件工具:BotMaster 18.5 Crack

BotMaster 拓展您的业务大师增加销量Whatsapp营销,使用 BotMaster 将您的业务提升到新的水平 - 最强大的 WhatsApp 营销软件,可促进销售和发展您的业务。 BotMaster 是一款革命性的 WhatsApp 营销工具,于 2022 年 1 月推出。这款功能强大的工…

zabbix、netdata和glances,做最简单的系统资源监控

软件需要显示服务器的资源信息(CPU、内存、网络、硬盘等),但是软件是在Docker容器中运行。 目前方案 通过ssh在主机上远程运行ps、free等指令,获取相应的信息。这种方案需要代码配置主机的IP,以及用户名和密码&#…

语聚AI知识库支持连接数据库,无需上传知识文档,数据分析更高效

数据库系统是企业信息技术基础架构的关键部分,它帮助企业管理和处理其数据,目前已有大量企业通过数据库保存数据,例如员工信息、客户数据、产品销售数据等等。但企业运营变得越来越复杂,数据库中的数据量也在持续增长,…

C++ 学习系列 -- 实现简单的 String

1 标准库 std::string c 中的 std::string 是一个重要的字符串的类, 我们在日常工作中常常与之打交道。 string是C标准库的重要部分&#xff0c;主要用于字符串处理。使用string库需要在同文件中包括该库 #include<string> std::string 实际上是 std::basic_string<…