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

源代碼: Lib/types.py


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

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

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

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

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

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

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

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

3.3 新版功能.

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

計(jì)算適當(dāng)?shù)脑?lèi)并創(chuàng)建類(lèi)命名空間。

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

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

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

3.3 新版功能.

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

參見(jiàn)

元類(lèi)

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

PEP 3115 - Python 3000 中的元類(lèi)

引入 __prepare__ 命名空間鉤子

types.resolve_bases(bases)?

動(dòng)態(tài)地解析 MRO 條目,具體描述見(jiàn) 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 新版功能.

參見(jiàn)

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

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

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

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

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

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

types.NoneType?

None 的類(lèi)型。

3.10 新版功能.

types.FunctionType?
types.LambdaType?

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

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

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

types.GeneratorType?

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

types.CoroutineType?

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

3.5 新版功能.

types.AsyncGeneratorType?

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

3.6 新版功能.

class types.CodeType(**kwargs)?

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

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

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

replace(**kwargs)?

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

3.8 新版功能.

types.CellType?

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

3.8 新版功能.

types.MethodType?

用戶(hù)自定義類(lèi)實(shí)例方法的類(lèi)型。

types.BuiltinFunctionType?
types.BuiltinMethodType?

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

types.WrapperDescriptorType?

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

3.7 新版功能.

types.MethodWrapperType?

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

3.7 新版功能.

types.NotImplementedType?

NotImplemented 的類(lèi)型。

3.10 新版功能.

types.MethodDescriptorType?

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

3.7 新版功能.

types.ClassMethodDescriptorType?

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

3.7 新版功能.

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

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

備注

如果你希望設(shè)置各種由導(dǎo)入控制的屬性,請(qǐng)使用 importlib.util.module_from_spec() 來(lái)創(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__?

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

__package__?

一個(gè)模塊所屬的 package。 如果模塊為最高層級(jí)的(即不是任何特定包的組成部分)則該屬性應(yīng)設(shè)為 '',否則它應(yīng)設(shè)為特定包的名稱(chēng) (如果模塊本身也是一個(gè)包則名稱(chēng)可以為 __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 的類(lèi)型。

3.10 新版功能.

class types.GenericAlias(t_origin, t_args)?

形參化泛型 的類(lèi)型,例如 list[int]

t_origin 應(yīng)當(dāng)是一個(gè)非形參化的泛型類(lèi),例如 list, tupledictt_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 版更改: 此類(lèi)型現(xiàn)在可以被子類(lèi)化。

class types.UnionType?

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

3.10 新版功能.

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

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

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

types.FrameType?

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

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

types.GetSetDescriptorType?

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

types.MemberDescriptorType?

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

CPython implementation detail: 在 Python 的其它實(shí)現(xiàn)中,此類(lèi)型可能與 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 新版功能.

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

class types.SimpleNamespace?

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

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

此類(lèi)型大致等價(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)化記錄類(lèi)型則應(yīng)改用 namedtuple()

3.3 新版功能.

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

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

在類(lèi)上訪問(wèn) __getattr__ 的路由屬性。

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

這允許有在實(shí)例上激活的特性屬性,同時(shí)又有在類(lèi)上的同名虛擬屬性 (一個(gè)例子請(qǐng)參見(jiàn) 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。 不過(guò),它沒(méi)有必要實(shí)現(xiàn) __await__() 方法。

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

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

3.5 新版功能.