[英]Missing type parameters for generic type "Callable"
向以下 function 添加類型提示的正確方法是什么?
from typing import Callable
def format_callback(f: Callable) -> Callable:
"""Function to wrap a function to use as a click callback.
Taken from https://stackoverflow.com/a/42110044/8056572
"""
return lambda _, __, x: f(x)
現在mypy
抱怨Missing type parameters for generic type "Callable"
該代碼需要與 Python 3.9 和 3.10 兼容。 如果需要,我可以使用typing_extensions
。
編輯:
以下通過mypy
,但Any
太多了,不符合我的口味。 有沒有更好的辦法?
from typing import Any
from typing import Callable
import click
def format_callback(f: Callable[[Any], Any]) -> Callable[[click.Context, dict[str, Any], Any], Any]:
"""Function to wrap a function to use as a click callback.
Taken from https://stackoverflow.com/a/42110044/8056572
"""
return lambda _, __, x: f(x)
無需查看click
,您可以立即解決的問題是提供與f(x)
匹配的類型變量:
from typing import Any, Callable, TypeVar
import click
ArgT = TypeVar("ArgT")
ReturnT = TypeVar("ReturnT")
def format_callback(
f: Callable[[ArgT], ReturnT]
) -> Callable[[click.Context, dict[str, Any], ArgT], ReturnT]:
return lambda _, __, x: f(x)
這將防止您在format_callback
的內部主體中輸入錯誤。
簡單瀏覽click
似乎表明您想將 format_callback 的返回值傳遞給以下format_callback
構造函數之一或其子類構造函數:
click.core.Parameter.__init__::callback
:
callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]]
click.core.Command.__init__::callback
callback: t.Optional[t.Callable[..., t.Any]]
現在,根據您鏈接到的另一個答案,它將關鍵字參數callback
給@click.argument
和@click.option
,看起來您實際上想要使用click.core.Parameter.__init__
,因為裝飾器' 后備類分別是ArgumentClass = click.core.Argument
和OptionClass = click.core.Option
,它們都是click.Core.Parameter
的子類。 這意味着根據click.core.Parameter.__init__::callback
的類型注釋,返回Callable
類型的第二個參數不能是dict[str, Any]
。 然后,你真的應該有這個:
def format_callback(
f: Callable[[ArgT], ReturnT]
) -> Callable[[click.Context, click.Parameter, ArgT], ReturnT]:
return lambda _, __, x: f(x)
由於您在click.Context
和click.Parameter
丟棄為_, __
,當然, lambda
是這些僅用於文檔目的。 它們很容易變成object, object
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.