[英]Type hinting Callable with no parameters
我想對沒有參數的函數使用類型提示
from typing import Callable
def no_parameters_returns_int() -> int:
return 7
def get_int_returns_int(a: int) -> int:
return a
def call_function(next_method: Callable[[], int]):
print(next_method())
call_function(no_parameters_returns_int) # no indication of error from IDE expected
call_function(get_int_returns_int) # expected an indication of error from IDE
當我傳遞一個帶參數的函數時,我希望 PyCharm 標記該行。 還嘗試了Callabale[[None], int]
和Callabale[[...], int]
。 然而,第一個提示傳遞的函數接收None
類型參數,第二個提示傳遞的函數接收至少一個參數。
是否可以暗示傳遞的函數不接收參數?
是否可以暗示傳遞的函數不接收參數?
在沒有參數的情況下鍵入提示Callable
的正確方法如下:
Callable[[t1, t2, ..., tn], tr]
。 具有位置參數類型t1
等的函數,並返回類型tr
。 參數列表可能為空 n==0 。
一個明確的例子在:
- Callable[[], int] is a subtype of Callable[[], float]. - Callable[[], Manager] is a subtype of Callable[[], Employee].
還有:
from typing import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body
內置名稱None
應該與None類型區分開來(第一個用於訪問第二個):
沒有任何
- 這種類型只有一個值。 有一個具有此值的對象。 該對象通過內置名稱
None
。
用作類型提示的內置名稱None
的語法和含義是一種特殊情況:
在類型提示中使用時,表達式
None
被認為等效於type(None)
。
考慮到上述情況,以下兩種方法 - 嘗試編寫沒有參數的函數的Callable
類型提示 - 是錯誤的也就不足為奇了:
Callable[[None], tr]
Callable[[type(None)], tr]
Callable
類型提示中的省略號僅表示:
請注意,省略號周圍沒有方括號。 在這種情況下,回調的參數完全不受約束(並且可以接受關鍵字參數)。
由於它是“不受約束的”,因此以下不太可能導致靜態類型檢查器因參數而發出任何警告:
Callable[..., tr]
值得注意的是, Callable
, Any
和...
(省略號)之間的關系。
同樣,注釋中的裸 Callable 等效於 Callable[..., Any]
最后,如果您通過MyPy運行您的代碼,實際上會發出預期的警告:
main.py:13: 錯誤:“call_function”的參數 1 具有不兼容的類型“Callable[[int], int]”; 預期“Callable[[], int]”在 1 個文件中發現 1 個錯誤(檢查 1 個源文件)
我在PyCharm 2020.2 Pro 中檢查了您的示例,IDE 沒有發出上述警告。 請注意, PyCharm 使用其自己的 PEP 484 實現,並且已知它們的靜態類型檢查器存在錯誤。
我想你發現了一個錯誤......
最后注意:運行type(None)
給出NoneType
。 在Python 3 中NoneType
沒有公開以供導入,盡管在 Python 2 中它是可導入的。
編輯:出於某種原因,Python 3.10 正在 重新引入types.NoneType
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.