ldc*_*ldc 5 python python-3.x mypy
我正在尝试输入提示接受可调用函数并具有默认参数的函数的参数(在下面的示例中set)
from typing import Callable, List
T = TypeVar("T")
def transform(data: List[int], ret_type: Callable[[List[int]], T] = set) -> T:
return ret_type(data)
a = [1, 2, 3]
my_set: Set = transform(a)
Run Code Online (Sandbox Code Playgroud)
上面的代码从 mypy 触发以下错误消息mypy3: Incompatible default for argument "ret_type" (default has type "Type[Set[Any]]", argument has type "Callable[[List[int]], T]")
正确的类型应该是什么ret_type?
编辑
下面的代码虽然不理想但工作正常(参见@chepner评论)
from typing import cast, Any, Callable, TypeVar
T = TypeVar("T")
def transform(data: Any, ret_type: Callable[..., T] = cast(Callable, set)) -> T:
return ret_type(data)
Run Code Online (Sandbox Code Playgroud)
您可以使用@overload为您的案例使用默认参数的函数进行正确的类型提示:
from typing import Callable, List, TypeVar, overload, Set
T = TypeVar("T")
@overload
def transform(data: List[int]) -> Set[int]: ...
@overload
def transform(data: List[int], ret_type: Callable[[List[int]], T]) -> T: ...
# untyped implementation
def transform(data, ret_type = set):
return ret_type(data)
a = [1, 2, 3]
my_set: Set = transform(a)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |