def foo(myarg, **other_args):
# do something
return bar(**other_args)
是否可以以某种方式注释该函数,让 IDE 清楚
other_args
是函数 bar()
的参数?这样 IDE 将在这种情况下提供有用的代码完成功能。
将这个答案与
Concatenate
结合:
def same_signature_with_one_leading_extra[**P, T, E](
_origin: Callable[P, T]
) -> Callable[
[Callable[Concatenate[E, ...], Any]],
Callable[Concatenate[E, P], T]
]:
def decorator(target: Callable[Concatenate[E, ...], Any]) -> Callable[Concatenate[E, P], T]:
return cast(Callable[Concatenate[E, P], T], target)
return decorator
def bar(*, lorem: bool, ipsum: float = 3.14) -> None:
...
@same_signature_with_one_leading_extra(bar)
def foo(myarg: Foo, *args: Any, **kwargs: Any) -> Any:
return bar(**kwargs)
reveal_type(foo) # (Foo, *, lorem: bool, ipsum: float = 3.14) -> None
请注意,Mypy 要求
myarg
仅限位置(/
):
@same_signature_with_one_leading_extra(bar)
def foo(myarg: Foo, /, *args: Any, **kwargs: Any) -> Any:
return bar(**kwargs)
Concatenate
将类型变量 E
添加到参数规范 P
之前。在上下文中:
E
指的是myarg
的类型,即Foo
P
指的是_origin
的签名,即(*, lorem: bool, ipsum: float = 3.14)
Concatenate[E, P]
被解析为(Foo, *, lorem: bool, ipsum: float = 3.14)
。它被包裹在 Callable[<>, T]
中,用作装饰器的返回类型,并成为 foo
的新类型。
VSCode/Pylance 对此有很好的支持(因为该数据直接取自 Pyright):
PyCharm,没那么多: