[英]Using type hint annotation using types.FunctionType vs typing.Callable?
使用types.FunctionType與Typing.Callable作為類型提示注釋有哪些缺點或好處?
考慮以下代碼...
import types
import typing
def functionA(func: types.FunctionType):
rt = func()
print(func.__name__)
return rt
def functionB(func: typing.Callable):
rt = func()
print(func.__name__)
return rt
我能看到的唯一區別是Callable
可以是任何類型的可調用對象(函數、方法、類等),而FunctionType
僅限於函數。
我是否忽略了什么? 在某些情況下,使用FunctionType
不是Callable
有好處嗎?
types
模塊早於 PEP 484 注釋,主要是為了使對象的運行時內省更容易。 例如,要確定某個值是否為函數,您可以運行isinstance(my_var, types.FunctionType)
。
typing
模塊包含專門用於輔助靜態分析工具(例如 mypy)的類型提示。 例如,假設您想指示一個參數必須是一個接受兩個 int 並返回一個str
的函數。 你可以這樣做:
def handle(f: Callable[[int, int], str]) -> None: ...
沒有辦法以類似的方式使用FunctionType
:它根本不是為此目的而設計的。
這個函數簽名也更靈活:它也可以接受諸如帶有__call__
對象之類的東西,因為這些對象確實是可調用的。
為方便起見, typing
模塊的內容有時也可用於運行時檢查,類似於types
的內容:例如,執行isinstance(f, Callable)
工作。 但是,此功能是故意限制的:故意禁止執行isinstance(f, Callable[[int, int], str])
。 嘗試執行該檢查將在運行時引發異常。
也就是說,我不認為使用來自typing
任何內容執行運行時檢查是一種好的風格: typing
模塊首先用於靜態分析。
出於類似的原因,我不會在類型提示中使用types
模塊中的任何內容。 唯一的例外是,如果您的函數的編寫方式使得您需要接收的值具體是FunctionType
的實例,而不是任意可調用的,則這一點至關重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.