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

源代碼: Lib/types.py


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

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

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

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

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

使用適當的元類(lèi)動(dòng)態(tài)地創(chuàng )建一個(gè)類(lèi)對象。

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

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

3.3 新版功能.

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

計算適當的元類(lèi)并創(chuàng )建類(lèi)命名空間。

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

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

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

3.3 新版功能.

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

參見(jiàn)

元類(lèi)

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

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

引入 __prepare__ 命名空間鉤子

types.resolve_bases(bases)?

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

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

3.7 新版功能.

參見(jiàn)

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

標準解釋器類(lèi)型?

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

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

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

以下類(lèi)型有相應的標準名稱(chēng)定義:

types.NoneType?

None 的類(lèi)型。

3.10 新版功能.

types.FunctionType?
types.LambdaType?

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

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

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

types.GeneratorType?

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

types.CoroutineType?

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

3.5 新版功能.

types.AsyncGeneratorType?

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

3.6 新版功能.

class types.CodeType(**kwargs)?

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

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

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

replace(**kwargs)?

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

3.8 新版功能.

types.CellType?

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

3.8 新版功能.

types.MethodType?

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

types.BuiltinFunctionType?
types.BuiltinMethodType?

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

types.WrapperDescriptorType?

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

3.7 新版功能.

types.MethodWrapperType?

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

3.7 新版功能.

types.NotImplementedType?

NotImplemented 的類(lèi)型。

3.10 新版功能.

types.MethodDescriptorType?

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

3.7 新版功能.

types.ClassMethodDescriptorType?

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

3.7 新版功能.

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

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

備注

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

__doc__?

模塊的 docstring。 默認為 None。

__loader__?

用于加載模塊的 loader。 默認為 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 版更改: 默認為 None。 之前該屬性為可選項。

__name__?

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

__package__?

一個(gè)模塊所屬的 package。 如果模塊為最高層級的(即不是任何特定包的組成部分)則該屬性應設為 '',否則它應設為特定包的名稱(chēng) (如果模塊本身也是一個(gè)包則名稱(chēng)可以為 __name__)。 默認為 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 版更改: 默認為 None。 之前該屬性為可選項。

__spec__?

模塊的導入系統相關(guān)狀態(tài)的記錄。 應當是一個(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 應當是一個(gè)非形參化的泛型類(lèi),例如 list, tupledict。 t_args 應當是一個(gè)形參化 t_origintuple (長(chá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)型現在可以被子類(lèi)化。

class types.UnionType?

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

3.10 新版功能.

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

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

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

types.FrameType?

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

請查看 語(yǔ)言參考 了解可用屬性和操作的細節。

types.GetSetDescriptorType?

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

types.MemberDescriptorType?

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

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

class types.MappingProxyType(mapping)?

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

3.3 新版功能.

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

key in proxy

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

proxy[key]

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

iter(proxy)

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

len(proxy)

返回下層映射中的項數。

copy()?

返回下層映射的淺拷貝。

get(key[, default])?

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

items()?

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

keys()?

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

values()?

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

reversed(proxy)

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

3.9 新版功能.

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

class types.SimpleNamespace?

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

不同于 object,對于 SimpleNamespace 你可以添加和移除屬性。 如果一個(gè) SimpleNamespace 對象使用關(guān)鍵字參數進(jìn)行初始化,這些參數會(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。 但是,對于結構化記錄類(lèi)型則應改用 namedtuple()。

3.3 新版功能.

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

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

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

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

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

3.4 新版功能.

協(xié)程工具函數?

types.coroutine(gen_func)?

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

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

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

3.5 新版功能.