types --- 動(dòng)態(tài)類型創(chuàng)建和內(nèi)置類型名稱?

源代碼: Lib/types.py


此模塊定義了一些工具函數(shù),用于協(xié)助動(dòng)態(tài)創(chuàng)建新的類型。

它還為某些對(duì)象類型定義了名稱,這些名稱由標(biāo)準(zhǔn) Python 解釋器所使用,但并不像內(nèi)置的 intstr 那樣對(duì)外公開。

最后,它還額外提供了一些類型相關(guān)但重要程度不足以作為內(nèi)置對(duì)象的工具類和函數(shù)。

動(dòng)態(tài)類型創(chuàng)建?

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

使用適當(dāng)?shù)脑悇?dòng)態(tài)地創(chuàng)建一個(gè)類對(duì)象。

前三個(gè)參數(shù)是組成類定義頭的部件:類名稱,基類 (有序排列),關(guān)鍵字參數(shù) (例如 metaclass)。

exec_body 參數(shù)是一個(gè)回調(diào)函數(shù),用于填充新創(chuàng)建類的命名空間。 它應(yīng)當(dāng)接受類命名空間作為其唯一的參數(shù)并使用類內(nèi)容直接更新命名空間。 如果未提供回調(diào)函數(shù),則它就等效于傳入 lambda ns: None。

3.3 新版功能.

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

計(jì)算適當(dāng)?shù)脑惒?chuàng)建類命名空間。

參數(shù)是組成類定義頭的部件:類名稱,基類 (有序排列) 以及關(guān)鍵字參數(shù) (例如 metaclass)。

返回值是一個(gè) 3 元組: metaclass, namespace, kwds

metaclass 是適當(dāng)?shù)脑悾?em>namespace 是預(yù)備好的類命名空間而 kwds 是所傳入 kwds 參數(shù)移除每個(gè) 'metaclass' 條目后的已更新副本。 如果未傳入 kwds 參數(shù),這將為一個(gè)空字典。

3.3 新版功能.

在 3.6 版更改: 所返回元組中 namespace 元素的默認(rèn)值已被改變。 現(xiàn)在當(dāng)元類沒有 __prepare__ 方法時(shí)將會(huì)使用一個(gè)保留插入順序的映射。

參見

元類

這些函數(shù)所支持的類創(chuàng)建過程的完整細(xì)節(jié)

PEP 3115 - Python 3000 中的元類

引入 __prepare__ 命名空間鉤子

types.resolve_bases(bases)?

動(dòng)態(tài)地解析 MRO 條目,具體描述見 PEP 560

此函數(shù)會(huì)在 bases 中查找不是 type 的實(shí)例的項(xiàng),并返回一個(gè)元組,其中每個(gè)具有 __mro_entries__ 方法的此種對(duì)象對(duì)象將被替換為調(diào)用該方法解包后的結(jié)果。 如果一個(gè) bases 項(xiàng)是 type 的實(shí)例,或它不具有 __mro_entries__ 方法,則它將不加改變地被包含在返回的元組中。

3.7 新版功能.

參見

PEP 560 - 對(duì) typing 模塊和泛型類型的核心支持

標(biāo)準(zhǔn)解釋器類型?

此模塊為許多類型提供了實(shí)現(xiàn) Python 解釋器所要求的名稱。 它刻意地避免了包含某些僅在處理過程中偶然出現(xiàn)的類型,例如 listiterator 類型。

此種名稱的典型應(yīng)用如 isinstance()issubclass() 檢測(cè)。

如果你要實(shí)例化這些類型中的任何一種,請(qǐng)注意其簽名在不同 Python 版本之間可能出現(xiàn)變化。

以下類型有相應(yīng)的標(biāo)準(zhǔn)名稱定義:

types.NoneType?

None 的類型。

3.10 新版功能.

types.FunctionType?
types.LambdaType?

用戶自定義函數(shù)以及由 lambda 表達(dá)式所創(chuàng)建函數(shù)的類型。

引發(fā)一個(gè) 審計(jì)事件 function.__new__,附帶參數(shù) code。

此審計(jì)事件只會(huì)被函數(shù)對(duì)象的直接實(shí)例化引發(fā),而不會(huì)被普通編譯所引發(fā)。

types.GeneratorType?

generator 迭代器對(duì)象的類型,由生成器函數(shù)創(chuàng)建。

types.CoroutineType?

coroutine 對(duì)象的類型,由 async def 函數(shù)創(chuàng)建。

3.5 新版功能.

types.AsyncGeneratorType?

asynchronous generator 迭代器對(duì)象的類型,由異步生成器函數(shù)創(chuàng)建。

3.6 新版功能.

class types.CodeType(**kwargs)?

代碼對(duì)象的類型,例如 compile() 的返回值。

引發(fā) 審計(jì)事件 code.__new__ 附帶參數(shù) code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags。

請(qǐng)注意被審計(jì)的參數(shù)可能與初始化代碼所要求的名稱或位置不相匹配。 審計(jì)事件只會(huì)被代碼對(duì)象的直接實(shí)例化引發(fā),而不會(huì)被普通編譯所引發(fā)。

replace(**kwargs)?

返回代碼對(duì)象的一個(gè)副本,使用指定的新字段值。

3.8 新版功能.

types.CellType?

單元對(duì)象的類型:這種對(duì)象被用作函數(shù)中自由變量的容器。

3.8 新版功能.

types.MethodType?

用戶自定義類實(shí)例方法的類型。

types.BuiltinFunctionType?
types.BuiltinMethodType?

內(nèi)置函數(shù)例如 len()sys.exit() 以及內(nèi)置類方法的類型。 (這里所說的“內(nèi)置”是指“以 C 語言編寫”。)

types.WrapperDescriptorType?

某些內(nèi)置數(shù)據(jù)類型和基類的方法的類型,例如 object.__init__()object.__lt__()。

3.7 新版功能.

types.MethodWrapperType?

某些內(nèi)置數(shù)據(jù)類型和基類的 綁定 方法的類型。 例如 object().__str__ 所屬的類型。

3.7 新版功能.

types.NotImplementedType?

NotImplemented 的類型。

3.10 新版功能.

types.MethodDescriptorType?

某些內(nèi)置數(shù)據(jù)類型方法例如 str.join() 的類型。

3.7 新版功能.

types.ClassMethodDescriptorType?

某些內(nèi)置數(shù)據(jù)類型 非綁定 類方法例如 dict.__dict__['fromkeys'] 的類型。

3.7 新版功能.

class types.ModuleType(name, doc=None)?

模塊 的類型。 構(gòu)造器接受待創(chuàng)建模塊的名稱并以其 docstring 作為可選參數(shù)。

備注

如果你希望設(shè)置各種由導(dǎo)入控制的屬性,請(qǐng)使用 importlib.util.module_from_spec() 來創(chuàng)建一個(gè)新模塊。

__doc__?

模塊的 docstring。 默認(rèn)為 None

__loader__?

用于加載模塊的 loader。 默認(rèn)為 None。

This attribute is to match importlib.machinery.ModuleSpec.loader as stored in the __spec__ object.

備注

A future version of Python may stop setting this attribute by default. To guard against this potential change, preferably read from the __spec__ attribute instead or use getattr(module, "__loader__", None) if you explicitly need to use this attribute.

在 3.4 版更改: 默認(rèn)為 None。 之前該屬性為可選項(xiàng)。

__name__?

模塊的名稱。 應(yīng)當(dāng)能匹配 importlib.machinery.ModuleSpec.name。

__package__?

一個(gè)模塊所屬的 package。 如果模塊為最高層級(jí)的(即不是任何特定包的組成部分)則該屬性應(yīng)設(shè)為 '',否則它應(yīng)設(shè)為特定包的名稱 (如果模塊本身也是一個(gè)包則名稱可以為 __name__)。 默認(rèn)為 None

This attribute is to match importlib.machinery.ModuleSpec.parent as stored in the __spec__ object.

備注

A future version of Python may stop setting this attribute by default. To guard against this potential change, preferably read from the __spec__ attribute instead or use getattr(module, "__package__", None) if you explicitly need to use this attribute.

在 3.4 版更改: 默認(rèn)為 None。 之前該屬性為可選項(xiàng)。

__spec__?

模塊的導(dǎo)入系統(tǒng)相關(guān)狀態(tài)的記錄。 應(yīng)當(dāng)是一個(gè) importlib.machinery.ModuleSpec 的實(shí)例。

3.4 新版功能.

types.EllipsisType?

Ellipsis 的類型。

3.10 新版功能.

class types.GenericAlias(t_origin, t_args)?

形參化泛型 的類型,例如 list[int]

t_origin 應(yīng)當(dāng)是一個(gè)非形參化的泛型類,例如 list, tupledict。 t_args 應(yīng)當(dāng)是一個(gè)形參化 t_origintuple (長(zhǎng)度可以為 1):

>>>
>>> from types import GenericAlias

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

3.9 新版功能.

在 3.9.2 版更改: 此類型現(xiàn)在可以被子類化。

class types.UnionType?

合并類型表達(dá)式 的類型。

3.10 新版功能.

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

回溯對(duì)象的類型,例如 sys.exc_info()[2] 中的對(duì)象。

請(qǐng)查看 語言參考 了解可用屬性和操作的細(xì)節(jié),以及動(dòng)態(tài)地創(chuàng)建回溯對(duì)象的指南。

types.FrameType?

幀對(duì)象的類型,例如 tb.tb_frame 中的對(duì)象,其中 tb 是一個(gè)回溯對(duì)象。

請(qǐng)查看 語言參考 了解可用屬性和操作的細(xì)節(jié)。

types.GetSetDescriptorType?

使用 PyGetSetDef 在擴(kuò)展模塊中定義的對(duì)象的類型,例如 FrameType.f_localsarray.array.typecode。 此類型被用作對(duì)象屬性的描述器;它的目的與 property 類型相同,但專門針對(duì)在擴(kuò)展模塊中定義的類。

types.MemberDescriptorType?

使用 PyMemberDef 在擴(kuò)展模塊中定義的對(duì)象的類型,例如 datetime.timedelta.days。 此類型被用作使用標(biāo)準(zhǔn)轉(zhuǎn)換函數(shù)的簡(jiǎn)單 C 數(shù)據(jù)成員的描述器;它的目的與 property 類型相同,但專門針對(duì)在擴(kuò)展模塊中定義的類。

CPython implementation detail: 在 Python 的其它實(shí)現(xiàn)中,此類型可能與 GetSetDescriptorType 完全相同。

class types.MappingProxyType(mapping)?

一個(gè)映射的只讀代理。 它提供了對(duì)映射條目的動(dòng)態(tài)視圖,這意味著當(dāng)映射發(fā)生改變時(shí),視圖會(huì)反映這些改變。

3.3 新版功能.

在 3.9 版更改: 更新為支持 PEP 584 所新增的合并 (|) 運(yùn)算符,它會(huì)簡(jiǎn)單地委托給下層的映射。

key in proxy

如果下層的映射中存在鍵 key 則返回 True,否則返回 False

proxy[key]

返回下層的映射中以 key 為鍵的項(xiàng)。 如果下層的映射中不存在鍵 key 則引發(fā) KeyError。

iter(proxy)

返回由下層映射的鍵為元素的迭代器。 這是 iter(proxy.keys()) 的快捷方式。

len(proxy)

返回下層映射中的項(xiàng)數(shù)。

copy()?

返回下層映射的淺拷貝。

get(key[, default])?

如果 key 存在于下層映射中則返回 key 的值,否則返回 default。 如果 default 未給出則默認(rèn)為 None,因而此方法絕不會(huì)引發(fā) KeyError

items()?

返回由下層映射的項(xiàng) ((鍵, 值) 對(duì)) 組成的一個(gè)新視圖。

keys()?

返回由下層映射的鍵組成的一個(gè)新視圖。

values()?

返回由下層映射的值組成的一個(gè)新視圖。

reversed(proxy)

返回一個(gè)包含下層映射的鍵的反向迭代器。

3.9 新版功能.

附加工具類和函數(shù)?

class types.SimpleNamespace?

一個(gè)簡(jiǎn)單的 object 子類,提供了訪問其命名空間的屬性,以及一個(gè)有意義的 repr。

不同于 object,對(duì)于 SimpleNamespace 你可以添加和移除屬性。 如果一個(gè) SimpleNamespace 對(duì)象使用關(guān)鍵字參數(shù)進(jìn)行初始化,這些參數(shù)會(huì)被直接加入下層命名空間。

此類型大致等價(jià)于以下代碼:

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。 但是,對(duì)于結(jié)構(gòu)化記錄類型則應(yīng)改用 namedtuple()。

3.3 新版功能.

在 3.9 版更改: repr 中的屬性順序由字母順序改為插入順序 (類似 dict)。

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)?

在類上訪問 __getattr__ 的路由屬性。

這是一個(gè)描述器,用于定義通過實(shí)例與通過類訪問時(shí)具有不同行為的屬性。 當(dāng)實(shí)例訪問時(shí)保持正常行為,但當(dāng)類訪問屬性時(shí)將被路由至類的 __getattr__ 方法;這是通過引發(fā) AttributeError 來完成的。

這允許有在實(shí)例上激活的特性屬性,同時(shí)又有在類上的同名虛擬屬性 (一個(gè)例子請(qǐng)參見 enum.Enum)。

3.4 新版功能.

協(xié)程工具函數(shù)?

types.coroutine(gen_func)?

此函數(shù)可將 generator 函數(shù)轉(zhuǎn)換為返回基于生成器的協(xié)程的 coroutine function。 基于生成器的協(xié)程仍然屬于 generator iterator,但同時(shí)又可被視為 coroutine 對(duì)象兼 awaitable。 不過,它沒有必要實(shí)現(xiàn) __await__() 方法。

如果 gen_func 是一個(gè)生成器函數(shù),它將被原地修改。

如果 gen_func 不是一個(gè)生成器函數(shù),則它會(huì)被包裝。 如果它返回一個(gè) collections.abc.Generator 的實(shí)例,該實(shí)例將被包裝在一個(gè) awaitable 代理對(duì)象中。 所有其他對(duì)象類型將被原樣返回。

3.5 新版功能.