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

源代碼: Lib/types.py


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

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

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

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

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

使用適當(dāng)?shù)脑悇討B(tài)地創(chuàng)建一個類對象。

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

exec_body 參數(shù)是一個回調(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)?

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

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

返回值是一個 3 元組: metaclass, namespace, kwds

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

3.3 新版功能.

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

參見

元類

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

PEP 3115 - Python 3000 中的元類

引入 __prepare__ 命名空間鉤子

types.resolve_bases(bases)?

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

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

3.7 新版功能.

參見

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

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

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

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

如果你要實例化這些類型中的任何一種,請注意其簽名在不同 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ā)一個 審計事件 function.__new__,附帶參數(shù) code。

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

types.GeneratorType?

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

types.CoroutineType?

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

3.5 新版功能.

types.AsyncGeneratorType?

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

3.6 新版功能.

class types.CodeType(**kwargs)?

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

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

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

replace(**kwargs)?

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

3.8 新版功能.

types.CellType?

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

3.8 新版功能.

types.MethodType?

用戶自定義類實例方法的類型。

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)入控制的屬性,請使用 importlib.util.module_from_spec() 來創(chuàng)建一個新模塊。

__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。 之前該屬性為可選項。

__name__?

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

__package__?

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

__spec__?

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

3.4 新版功能.

types.EllipsisType?

Ellipsis 的類型。

3.10 新版功能.

class types.GenericAlias(t_origin, t_args)?

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

t_origin 應(yīng)當(dāng)是一個非形參化的泛型類,例如 list, tupledict。 t_args 應(yīng)當(dāng)是一個形參化 t_origintuple (長度可以為 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)?

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

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

types.FrameType?

幀對象的類型,例如 tb.tb_frame 中的對象,其中 tb 是一個回溯對象。

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

types.GetSetDescriptorType?

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

types.MemberDescriptorType?

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

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

class types.MappingProxyType(mapping)?

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

3.3 新版功能.

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

key in proxy

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

proxy[key]

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

iter(proxy)

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

len(proxy)

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

copy()?

返回下層映射的淺拷貝。

get(key[, default])?

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

items()?

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

keys()?

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

values()?

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

reversed(proxy)

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

3.9 新版功能.

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

class types.SimpleNamespace?

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

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

此類型大致等價于以下代碼:

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

3.3 新版功能.

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

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

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

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

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

3.4 新版功能.

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

types.coroutine(gen_func)?

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

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

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

3.5 新版功能.