簡體   English   中英

通用類型“Callable”缺少類型參數

[英]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構造函數之一或其子類構造函數:

現在,根據您鏈接到的另一個答案,它將關鍵字參數callback@click.argument@click.option ,看起來您實際上想要使用click.core.Parameter.__init__ ,因為裝飾器' 后備類分別是ArgumentClass = click.core.ArgumentOptionClass = 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.Contextclick.Parameter丟棄為_, __ ,當然, lambda是這些僅用於文檔目的。 它們很容易變成object, object

暫無
暫無

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

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