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 解釋器所使用,但并不像內置的 int
或 str
那樣對外公開(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)
- 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.FunctionType?
- types.LambdaType?
用戶(hù)自定義函數以及由
lambda
表達式所創(chuàng )建函數的類(lèi)型。引發(fā)一個(gè) 審計事件
function.__new__
,附帶參數code
。此審計事件只會(huì )被函數對象的直接實(shí)例化引發(fā),而不會(huì )被普通編譯所引發(fā)。
- 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è)新模塊。- __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 usegetattr(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 usegetattr(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 新版功能.
- class types.GenericAlias(t_origin, t_args)?
形參化泛型 的類(lèi)型,例如
list[int]
。t_origin
應當是一個(gè)非形參化的泛型類(lèi),例如list
,tuple
或dict
。t_args
應當是一個(gè)形參化t_origin
的tuple
(長(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.GetSetDescriptorType?
使用
PyGetSetDef
在擴展模塊中定義的對象的類(lèi)型,例如FrameType.f_locals
或array.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 新版功能.