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

源代碼: Lib/types.py


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

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

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

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

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

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

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

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

3.3 新版功能.

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

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

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

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

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

3.3 新版功能.

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

參見

元類

這些函數(shù)所支持的類創(chuàng)建過程的完整細節(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 模塊和泛型類型的核心支持

標準解釋器類型?

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

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

以下類型有相應(yīng)的標準名稱定義:

types.FunctionType?
types.LambdaType?

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

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 新版功能.

types.CodeType?

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

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

__doc__?

模塊的 docstring。 默認為 None。

__loader__?

用于加載模塊的 loader。 默認為 None。

在 3.4 版更改: 默認為 None。 之前該屬性為可選項。

__name__?

模塊的名稱。

__package__?

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

在 3.4 版更改: 默認為 None。 之前該屬性為可選項。

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

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

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

types.FrameType?

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

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

types.GetSetDescriptorType?

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

types.MemberDescriptorType?

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

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

class types.MappingProxyType(mapping)?

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

3.3 新版功能.

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 未給出則默認為 None,因而此方法絕不會引發(fā) KeyError

items()?

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

keys()?

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

values()?

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

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

class types.SimpleNamespace?

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

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

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

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

SimpleNamespace 可被用于替代 class NS: pass。 但是,對于結(jié)構(gòu)化記錄類型則應(yīng)改用 namedtuple()。

3.3 新版功能.

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

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

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

這樣就允許有在實例上激活的特征屬性,同時又有在類上的同名虛擬屬性(一個這樣的例子是 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 新版功能.