说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 标准库 types 模块定义了一些工具函数,用于协助动态创建新的类型。它还为某些对象类型定义了名称,这些名称由标准 Python 解释器所使用,但并不像内置的 int 或 str 那样对外公开。
types 模块包含标准解释器定义的所有对象类型的类型对象,同一类型的所有对象共享一个类型的对象。可以使用 is 测试对象是否具有给定类型:
import types
# 合并类型表达式 类型
isinstance(int|str, types.UnionType)
# True
# 省略号类型
type(...) is types.EllipsisType
# True
# 合并类型表达式 类型
isinstance(None, types.NoneType)
# True
'''
此模块为许多类型提供了实现 Python 解释器所要求的名称。 它刻意地避免了包含某些仅在处理过程中偶然出现的类型,例如 listiterator 类型。
以下类型有相应的标准名称定义:
类型 | 名称 | 备注 |
---|---|---|
types.NoneType | None 的类型 | 3.10 新版功能 |
types.FunctionType types.LambdaType | 用户自定义函数以及由 lambda 表达式所创建函数的类型 | |
types.GeneratorType | generator 迭代器对象的类型,由生成器函数创建 | |
types.CoroutineType | coroutine 对象的类型,由 async def 函数创建 | 3.5 新版功能 |
types.AsyncGeneratorType | asynchronous generator 迭代器对象的类型,由异步生成器函数创建 | 3.6 新版功能 |
class types.CodeType | 代码对象的类型 | 例如 compile() 的返回值 |
types.CellType | 单元对象的类型:这种对象被用作函数中自由变量的容器 | 3.8 新版功能 |
types.MethodType | 用户自定义类实例方法的类型 | |
types.BuiltinFunctionType types.BuiltinMethodType | 内置函数例如 len() 或 sys.exit() 以及内置类方法的类型 | “内置”是指“以 C 语言编写” |
types.WrapperDescriptorType | 某些内置数据类型和基类的方法的类型 | 例如 object.__init__() 或 object.__lt__() |
types.MethodWrapperType | 某些内置数据类型和基类的 绑定 方法的类型 | 例如 object().__str__ |
types.NotImplementedType | NotImplemented 的类型 | 3.10 新版功能 |
types.MethodDescriptorType | 某些内置数据类型方法例如 str.join() 的类型 | |
types.ClassMethodDescriptorType | 某些内置数据类型 非绑定 类方法 | 例如 dict.__dict__['fromkeys'] |
class types.ModuleType | 模块 的类型 | |
types.EllipsisType | Ellipsis(... ) 的类型 |
|
class types.GenericAlias | 形参化泛型 的类型 | 例如 list[int], 3.9 新版功能 |
class types.UnionType | 合并类型表达式 的类型 | 3.10 新版功能 |
class types.TracebackType | 回溯对象的类型 | 例如 sys.exc_info()[2] |
types.FrameType | 帧对象的类型 | 例如 tb.tb_frame 中的对象,其中 tb 是一个回溯对象 |
types.GetSetDescriptorType | 使用 PyGetSetDef 在扩展模块中定义的对象的类型。 此类型被用作对象属性的描述器;它的目的与 property 类型相同,但专门针对在扩展模块中定义的类 | 例如 FrameType.f_locals 或 array.array.typecode |
types.MemberDescriptorType | 使用 PyMemberDef 在扩展模块中定义的对象的类型 | 例如 datetime.timedelta.days |
class types.MappingProxyType | 一个映射的只读代理。 它提供了对映射条目的动态视图,这意味着当映射发生改变时,视图会反映这些改变。 |
此种名称的典型应用如 isinstance() 或 issubclass() 检测。如果你要实例化这些类型中的任何一种,请注意其签名在不同 Python 版本之间可能出现变化。
上表中名称前有 class 的为构造器。
types.CodeType(**kwargs)
要传入需要至少14个参数,为def f(): print(2)
的 dir(f.__code__)
中 co 开头的字段,这些字段的意义可访问 inspect 类型和成员,也可在这个 stackoverflow 回答 查看更多内容。
引发 审计事件 code.__new__
附带参数 code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags。
请注意被审计的参数可能与初始化代码所要求的名称或位置不相匹配。 审计事件只会被代码对象的直接实例化引发,而不会被普通编译所引发。
Python 3.8 新类型代码对象方法 replace(**kwargs)
可以替换指定的属性值,它返回代码对象的一个副本,使用指定的新字段值。
语法为 types.ModuleType(name, doc=None)
构造器接受待创建模块的名称并以其 docstring 作为可选参数。
注解 如果你希望设置各种由导入控制的属性,请使用 importlib.util.module_from_spec() 来创建一个新模块。
一些对象的属性:
__doc__
:模块的 docstring,默认为 None。__name__
:模块的名称。 应当能匹配 importlib.machinery.ModuleSpec.name
__spec__
:模块的导入系统相关状态的记录。 应当是一个 importlib.machinery.ModuleSpec
的实例,3.4 新版功能.示例:
m = types.ModuleType('my module', doc='这是我创建的模块')
m
# <module 'my module'>
type(m)
# module
m.__doc__
# '这是我创建的模块'
m.__name__
# 'my module'
m.__spec__
isinstance(m, types.ModuleType)
# True
形参化泛型的类型 types.GenericAlias(t_origin, t_args)
,参数:
如:
from types import GenericAlias
list[int] == GenericAlias(list, (int,))
# True
dict[str, int] == GenericAlias(dict, (str, int))
# True
3.9 新版功能,在 3.9.2 版更改: 此类型现在可以被子类化。
构造映射的只读代理 types.MappingProxyType(mapping)
, 它提供了对映射条目的动态视图,这意味着当映射发生改变时,视图会反映这些改变。在 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 新版功能语法为 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)
动态地解析 MRO 条目,具体描述见 PEP 560。
此函数会在 bases 中查找不是 type 的实例的项,并返回一个元组,其中每个具有 __mro_entries__
方法的此种对象对象将被替换为调用该方法解包后的结果。 如果一个 bases 项是 type 的实例,或它不具有 __mro_entries__
方法,则它将不加改变地被包含在返回的元组中。
3.7 新版功能.
todo
# 更多(首字母大写并以 Type 结尾的)
dir(types)
'''
['AsyncGeneratorType',
'BuiltinFunctionType',
'BuiltinMethodType',
'CellType',
'ClassMethodDescriptorType',
'CodeType',
'CoroutineType',
'DynamicClassAttribute',
'EllipsisType',
'FrameType',
'FunctionType',
'GeneratorType',
'GenericAlias',
'GetSetDescriptorType',
'LambdaType',
'MappingProxyType',
'MemberDescriptorType',
'MethodDescriptorType',
'MethodType',
'MethodWrapperType',
'ModuleType',
'NoneType',
'NotImplementedType',
'SimpleNamespace',
'TracebackType',
'UnionType',
'WrapperDescriptorType',
'_GeneratorWrapper',
'__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_calculate_meta',
'_cell_factory',
'coroutine',
'new_class',
'prepare_class',
'resolve_bases']
更新时间:2022-02-13 02:09:15 标签:python 标准库 数据类型