types
— 動態型別建立和內建型別的名稱¶
原始碼: 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__
方法時,將使用保留插入順序的對映。
- types.resolve_bases(bases)¶
按照 PEP 560 的規定,動態解析 MRO 條目。
此函式查詢 bases 中不是
type
例項的項,並返回一個元組,其中每個具有__mro_entries__()
方法的此類物件都將替換為此方法呼叫的解包結果。如果 bases 項是type
的例項,或者它沒有__mro_entries__()
方法,則它將在返回的元組中保持不變。3.7 版本中新增。
- types.get_original_bases(cls, /)¶
返回最初作為 cls 的基類給出的物件元組,在
__mro_entries__()
方法在任何基類上呼叫之前(遵循 PEP 560 中規定的機制)。這對於內省 泛型 非常有用。對於具有
__orig_bases__
屬性的類,此函式返回cls.__orig_bases__
的值。對於沒有__orig_bases__
屬性的類,將返回cls.__bases__
。示例
from typing import TypeVar, Generic, NamedTuple, TypedDict T = 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 - 用於型別模組和泛型型別的核心支援
標準直譯器型別¶
此模組為實現 Python 直譯器所需的許多型別提供了名稱。它故意避免包含一些在處理過程中偶然出現的型別,例如 listiterator
型別。
這些名稱的典型用途是用於 isinstance()
或 issubclass()
檢查。
如果您例項化這些型別中的任何一個,請注意,Python 版本之間的簽名可能有所不同。
為以下型別定義了標準名稱
- types.FunctionType¶
- types.LambdaType¶
使用者定義的函式和由
lambda
表示式建立的函式的型別。使用引數
code
引發 審計事件function.__new__
。審計事件僅在直接例項化函式物件時發生,並且不會針對正常編譯引發。
- class types.CodeType(**kwargs)¶
-
引發帶有引數
code
,filename
,name
,argcount
,posonlyargcount
,kwonlyargcount
,nlocals
,stacksize
,flags
的 審計事件code.__new__
。請注意,審計引數可能與初始化器要求的名稱或位置不匹配。審計事件僅在直接例項化程式碼物件時發生,不會在正常編譯時引發。
- 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)¶
模組的型別。 建構函式接受要建立的模組的名稱以及可選的文件字串。
參見
- 有關模組物件的文件
提供有關
ModuleType
例項上可以找到的特殊屬性的詳細資訊。importlib.util.module_from_spec()
使用
ModuleType
建構函式建立的模組在建立時,其許多特殊屬性都未設定或設定為預設值。module_from_spec()
提供了一種更健壯的方式來建立ModuleType
例項,以確保正確設定各種屬性。
- class types.GenericAlias(t_origin, t_args)¶
引數化泛型的型別,例如
list[int]
。t_origin
應該是一個非引數化的泛型類,例如list
、tuple
或dict
。t_args
應該是一個tuple
(長度可能為 1),它由引數化t_origin
的型別組成。>>> from types import GenericAlias >>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
3.9 版本新增。
在 3.9.2 版本中變更: 此型別現在可以被子類化。
- 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
型別相同,但用於在擴充套件模組中定義的類。此外,當使用
__slots__
屬性定義類時,對於每個槽,都會在類上新增一個MemberDescriptorType
的例項作為屬性。這允許槽出現在類的__dict__
中。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()¶
返回底層對映項(
(key, value)
對)的新檢視。
- keys()¶
返回底層對映鍵的新檢視。
- values()¶
返回底層對映值的新檢視。
- reversed(proxy)
返回底層對映鍵的反向迭代器。
3.9 版本新增。
- hash(proxy)
返回底層對映的雜湊值。
3.12 版本中新增。
其他實用工具類和函式¶
- class types.SimpleNamespace¶
一個簡單的
object
子類,它提供對其名稱空間的屬性訪問,以及有意義的 repr。與
object
不同,使用SimpleNamespace
可以新增和刪除屬性。SimpleNamespace
物件可以像dict
一樣初始化:使用關鍵字引數,使用單個位置引數,或兩者都使用。當使用關鍵字引數初始化時,這些引數會直接新增到底層名稱空間。或者,當使用位置引數初始化時,底層名稱空間將使用該引數中的鍵值對進行更新(可以是對映物件或生成鍵值對的 可迭代 物件)。所有此類鍵必須是字串。該型別大致等效於以下程式碼
class SimpleNamespace: def __init__(self, mapping_or_iterable=(), /, **kwargs): self.__dict__.update(mapping_or_iterable) 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()
。SimpleNamespace
物件受copy.replace()
支援。3.3 版本中新增。
在 3.9 版本中更改: repr 中的屬性順序從字母順序更改為插入順序(如
dict
)。在 3.13 版本中更改: 添加了對可選位置引數的支援。
協程實用工具函式¶
- types.coroutine(gen_func)¶
此函式將 生成器 函式轉換為 協程函式,該協程函式返回基於生成器的協程。基於生成器的協程仍然是一個 生成器迭代器,但也被認為是 協程 物件並且是 可等待 的。但是,它可能不一定實現
__await__()
方法。如果 *gen_func* 是生成器函式,它將被就地修改。
如果 *gen_func* 不是生成器函式,它將被包裝。如果它返回
collections.abc.Generator
的例項,則該例項將被包裝在 *awaitable* 代理物件中。所有其他型別的物件將按原樣返回。3.5 版本中新增。