簡體   English   中英

使用類型提示注釋使用 types.FunctionType 還是 typing.Callable?

[英]Using type hint annotation using types.FunctionType vs typing.Callable?

使用types.FunctionTypeTyping.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM