目錄
動態類型創建
標準解釋器類型
附加工具類和函數
協程工具函數
源代碼:?Lib/types.py
此模塊定義了一些工具函數,用于協助動態創建新的類型。
它還為某些對象類型定義了名稱,這些名稱由標準 Python 解釋器所使用,但并不像內置的?int?或?str?那樣對外公開。
最后,它還額外提供了一些類型相關但重要程度不足以作為內置對象的工具類和函數。
動態類型創建
types.new_class(name,?bases=(),?kwds=None,?exec_body=None)
使用適當的元類動態地創建一個類對象。
前三個參數是組成類定義頭的部件:類名稱,基類 (有序排列),關鍵字參數 (例如?metaclass
)。
exec_body?參數是一個回調函數,用于填充新創建類的命名空間。 它應當接受類命名空間作為其唯一的參數并使用類內容直接更新命名空間。 如果未提供回調函數,則它就等效于傳入?lambda?ns:?None
。
3.3 新版功能.
types.prepare_class(name,?bases=(),?kwds=None)
計算適當的元類并創建類命名空間。
參數是組成類定義頭的部件:類名稱,基類 (有序排列) 以及關鍵字參數 (例如?metaclass
)。
返回值是一個 3 元組:?metaclass,?namespace,?kwds
metaclass?是適當的元類,namespace?是預備好的類命名空間而?kwds?是所傳入?kwds?參數移除每個?'metaclass'
?條目后的已更新副本。 如果未傳入?kwds?參數,這將為一個空字典。
3.3 新版功能.
在 3.6 版更改:?所返回元組中?namespace
?元素的默認值已被改變。 現在當元類沒有?__prepare__
?方法時將會使用一個保留插入順序的映射。
參見
元類
這些函數所支持的類創建過程的完整細節
PEP 3115?- Python 3000 中的元類
引入?__prepare__
?命名空間鉤子
types.resolve_bases(bases)
動態地解析 MRO 條目,具體描述見?PEP 560。
此函數會在?bases?中查找不是?type?的實例的項,并返回一個元組,其中每個具有?__mro_entries__()?方法的此種對象將被替換為調用該方法解包后的結果。 如果一個?bases?項是?type?的實例,或它不具有?__mro_entries__()
?方法 ,則它將不加改變地被包括在返回的元組中。
3.7 新版功能.
types.get_original_bases(cls,?/)
在?__mro_entries__()?方法在任何基類上被調用之前返回最初是作為?cls?的基類給出的對象元組(根據?PEP 560?所描述的機制)。 這在對?泛型?進行內省時很有用處。
對于具有?__orig_bases__
?屬性的類,此函數將返回?cls.__orig_bases__
?的值。 對于沒有?__orig_bases__
?屬性的類,則將返回?cls.__bases__
。
示例:
from typing import TypeVar, Generic, NamedTuple, TypedDictT = TypeVar("T") class Foo(Generic[T]): ... class Bar(Foo[int], float): ... class Baz(list[str]): ... Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) Spam = TypedDict("Spam", {"a": int, "b": str})assert Bar.__bases__ == (Foo, float) assert get_original_bases(Bar) == (Foo[int], float)assert Baz.__bases__ == (list,) assert get_original_bases(Baz) == (list[str],)assert Eggs.__bases__ == (tuple,) assert get_original_bases(Eggs) == (NamedTuple,)assert Spam.__bases__ == (dict,) assert get_original_bases(Spam) == (TypedDict,)assert int.__bases__ == (object,) assert get_original_bases(int) == (object,)
3.12 新版功能.
參見
PEP 560?- 對 typing 模塊和泛型類型的核心支持
標準解釋器類型
此模塊為許多類型提供了實現 Python 解釋器所要求的名稱。 它刻意地避免了包含某些僅在處理過程中偶然出現的類型,例如?listiterator
?類型。
此種名稱的典型應用如?isinstance()?或?issubclass()?檢測。
如果你要實例化這些類型中的任何一種,請注意其簽名在不同 Python 版本之間可能出現變化。
以下類型有相應的標準名稱定義:
types.NoneType
None?的類型。
3.10 新版功能.
types.FunctionType
types.LambdaType
用戶自定義函數以及由?lambda?表達式所創建函數的類型。
引發一個?審計事件?function.__new__
,附帶參數?code
。
此審計事件只會被函數對象的直接實例化引發,而不會被普通編譯所引發。
types.GeneratorType
generator?迭代器對象的類型,由生成器函數創建。
types.CoroutineType
coroutine?對象的類型,由?async?def?函數創建。
3.5 新版功能.
types.AsyncGeneratorType
asynchronous generator?迭代器對象的類型,由異步生成器函數創建。
3.6 新版功能.
class?types.CodeType(**kwargs)
代碼對象的類型,例如?compile()?的返回值。
引發?審計事件?code.__new__
?附帶參數?code
,?filename
,?name
,?argcount
,?posonlyargcount
,?kwonlyargcount
,?nlocals
,?stacksize
,?flags
。
請注意被審計的參數可能與初始化代碼所要求的名稱或位置不相匹配。 審計事件只會被代碼對象的直接實例化引發,而不會被普通編譯所引發。
replace(**kwargs)
返回代碼對象的一個副本,使用指定的新字段值。
3.8 新版功能.
types.CellType
單元對象的類型:這種對象被用作函數中自由變量的容器。
3.8 新版功能.
types.MethodType
用戶自定義類實例方法的類型。
types.BuiltinFunctionType
types.BuiltinMethodType
內置函數例如?len()?或?sys.exit()?以及內置類方法的類型。 (這里所說的“內置”是指“以 C 語言編寫”。)
types.WrapperDescriptorType
某些內置數據類型和基類的方法的類型,例如?object.__init__()?或?object.__lt__()。
3.7 新版功能.
types.MethodWrapperType
某些內置數據類型和基類的?綁定?方法的類型。 例如?object().__str__
?所屬的類型。
3.7 新版功能.
types.NotImplementedType
NotImplemented?的類型。
3.10 新版功能.
types.MethodDescriptorType
某些內置數據類型方法例如?str.join()?的類型。
3.7 新版功能.
types.ClassMethodDescriptorType
某些內置數據類型?非綁定?類方法例如?dict.__dict__['fromkeys']
?的類型。
3.7 新版功能.
class?types.ModuleType(name,?doc=None)
模塊?的類型。 構造器接受待創建模塊的名稱并以其?docstring?作為可選參數。
備注
如果你希望設置各種由導入控制的屬性,請使用?importlib.util.module_from_spec()?來創建一個新模塊。
__doc__
模塊的?docstring。 默認為?None
。
__loader__
用于加載模塊的?loader。 默認為?None
。
此屬性會匹配保存在?__spec__?object 對象中的?importlib.machinery.ModuleSpec.loader。
備注
未來的 Python 版本可能會停止默認設置此屬性。 為了避免這個潛在變化的影響,如果你明確地需要使用此屬性則推薦改從?__spec__?屬性讀取或是使用?getattr(module,?"__loader__",?None)
。
在 3.4 版更改:?默認為?None
。 之前該屬性為可選項。
__name__
模塊的名稱。 應當能匹配?importlib.machinery.ModuleSpec.name。
__package__
一個模塊所屬的?package。 如果模塊為最高層級的(即不是任何特定包的組成部分)則該屬性應設為?''
,否則它應設為特定包的名稱 (如果模塊本身也是一個包則名稱可以為?__name__)。 默認為?None
。
此屬性會匹配保存在?__spec__?對象中的?importlib.machinery.ModuleSpec.parent。
備注
未來的 Python 版本可能停止默認設置此屬性。 為了避免這個潛在變化的影響,如果你明確地需要使用此屬性則推薦改從?__spec__?屬性讀取或是使用?getattr(module,?"__package__",?None)
。
在 3.4 版更改:?默認為?None
。 之前該屬性為可選項。
__spec__
模塊的導入系統相關狀態的記錄。 應當是一個?importlib.machinery.ModuleSpec?的實例。
3.4 新版功能.
types.EllipsisType
Ellipsis?的類型。
3.10 新版功能.
class?types.GenericAlias(t_origin,?t_args)
形參化泛型?的類型,例如?list[int]
。
t_origin
?應當是一個非形參化的泛型類,例如?list
,?tuple
?或?dict
。?t_args
?應當是一個形參化?t_origin
?的?tuple?(長度可以為 1):
>>>
>>> from types import GenericAlias>>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
3.9 新版功能.
在 3.9.2 版更改:?此類型現在可以被子類化。
參見
泛用別名類型
有關?types.GenericAlias
?實例的詳細文檔
PEP 585?- 標準多項集中的類型提示泛型
引入?types.GenericAlias
?類
class?types.UnionType
合并類型表達式?的類型。
3.10 新版功能.
class?types.TracebackType(tb_next,?tb_frame,?tb_lasti,?tb_lineno)
回溯對象的類型,如在?sys.exception().__traceback__
?中找到的一樣。
請查看?語言參考?了解可用屬性和操作的細節,以及動態地創建回溯對象的指南。
types.FrameType
幀對象的類型,例如?tb.tb_frame
?中的對象,其中?tb
?是一個回溯對象。
請查看?語言參考?了解可用屬性和操作的細節。
types.GetSetDescriptorType
使用?PyGetSetDef
?在擴展模塊中定義的對象的類型,例如?FrameType.f_locals?或?array.array.typecode
。 此類型被用作對象屬性的描述器;它的目的與?property?類型相同,但專門針對在擴展模塊中定義的類。
types.MemberDescriptorType
使用?PyMemberDef
?在擴展模塊中定義的對象的類型,例如?datetime.timedelta.days
。 此類型被用作使用標準轉換函數的簡單 C 數據成員的描述器;它的目的與?property?類型相同,但專門針對在擴展模塊中定義的類。
CPython 實現細節:?在 Python 的其它實現中,此類型可能與?GetSetDescriptorType
?完全相同。
class?types.MappingProxyType(mapping)
一個映射的只讀代理。 它提供了對映射條目的動態視圖,這意味著當映射發生改變時,視圖會反映這些改變。
3.3 新版功能.
在 3.9 版更改:?更新為支持?PEP 584?所新增的合并 (|
) 運算符,它會簡單地委托給下層的映射。
key?in?proxy
如果下層的映射中存在鍵?key?則返回?True
,否則返回?False
。
proxy[key]
返回下層的映射中以?key?為鍵的項。 如果下層的映射中不存在鍵?key?則引發?KeyError。
iter(proxy)
返回由下層映射的鍵為元素的迭代器。 這是?iter(proxy.keys())
?的快捷方式。
len(proxy)
返回下層映射中的項數。
copy()
返回下層映射的淺拷貝。
get(key[,?default])
如果?key?存在于下層映射中則返回?key?的值,否則返回?default。 如果?default?未給出則默認為?None
,因而此方法絕不會引發?KeyError。
items()
返回由下層映射的項 ((鍵,?值)
?對) 組成的一個新視圖。
keys()
返回由下層映射的鍵組成的一個新視圖。
values()
返回由下層映射的值組成的一個新視圖。
reversed(proxy)
返回一個包含下層映射的鍵的反向迭代器。
3.9 新版功能.
hash(proxy)
返回下層映射的哈希值。
3.12 新版功能.
附加工具類和函數
class?types.SimpleNamespace
一個簡單的?object?子類,提供了訪問其命名空間的屬性,以及一個有意義的 repr。
不同于?object,對于?SimpleNamespace
?你可以添加和移除屬性。 如果一個?SimpleNamespace
?對象使用關鍵字參數進行初始化,這些參數會被直接加入下層命名空間。
此類型大致等價于以下代碼:
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
。 但是,對于結構化記錄類型則應改用?namedtuple()。
3.3 新版功能.
在 3.9 版更改:?repr 中的屬性順序由字母順序改為插入順序 (類似?dict
)。
types.DynamicClassAttribute(fget=None,?fset=None,?fdel=None,?doc=None)
在類上訪問 __getattr__ 的路由屬性。
這是一個描述器,用于定義通過實例與通過類訪問時具有不同行為的屬性。 當實例訪問時保持正常行為,但當類訪問屬性時將被路由至類的 __getattr__ 方法;這是通過引發 AttributeError 來完成的。
這允許有在實例上激活的特性屬性,同時又有在類上的同名虛擬屬性 (一個例子請參見?enum.Enum)。
3.4 新版功能.
協程工具函數
types.coroutine(gen_func)
此函數可將?generator?函數轉換為一個返回基于生成器的協程的?coroutine function。 基于生成器的協程仍然屬于?generator iterator,但同時又可被視為?coroutine?對象兼?awaitable。 不過,它沒有必要實現?__await__()?方法。
如果?gen_func?是一個生成器函數,它將被原地修改。
如果?gen_func?不是一個生成器函數,則它會被包裝。 如果它返回一個?collections.abc.Generator?的實例,該實例將被包裝在一個?awaitable?代理對象中。 所有其他對象類型將被原樣返回。
3.5 新版功能.