簡體   English   中英

類型提示 Callable 不帶參數

[英]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的正確方法如下:

“基本構建塊” ,PEP 483

Callable[[t1, t2, ..., tn], tr] 具有位置參數類型t1等的函數,並返回類型tr 參數列表可能為空 n==0

一個明確的例子在:

“協方差和逆變” ,PEP 483

 - Callable[[], int] is a subtype of Callable[[], float]. - Callable[[], Manager] is a subtype of Callable[[], Employee].

還有:

“可調用” ,PEP 484

 from typing import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body

內置名稱None應該與None類型區分開來(第一個用於訪問第二個):

3.2. 標准類型層次結構,數據模型

沒有任何

  • 這種類型只有一個值。 一個具有此值的對象 對象通過內置名稱None

用作類型提示的內置名稱None的語法和含義是一種特殊情況:

“不使用” ,PEP 484

在類型提示中使用時,表達式None被認為等效於type(None)

考慮到上述情況,以下兩種方法 - 嘗試編寫沒有參數的函數的Callable類型提示 - 是錯誤的也就不足為奇了:

Callable[[None], tr]
Callable[[type(None)], tr]

Callable類型提示中的省略號僅表示:

“可調用” ,PEP 484

請注意,省略號周圍沒有方括號。 在這種情況下,回調的參數完全不受約束(並且可以接受關鍵字參數)。

由於它是“不受約束的”,因此以下不太可能導致靜態類型檢查器因參數而發出任何警告:

Callable[..., tr]

值得注意的是, CallableAny... (省略號)之間的關系。

Any類型” ,PEP 484

同樣,注釋中的裸 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 實現,並且已知它們的靜態類型檢查器存在錯誤

我想你發現了一個錯誤......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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