python注释函数将参数传递给另一个函数

问题描述 投票:0回答:1
def foo(myarg, **other_args):
    # do something
    return bar(**other_args)

是否可以以某种方式注释该函数,让 IDE 清楚

other_args
是函数
bar()
的参数?这样 IDE 将在这种情况下提供有用的代码完成功能。

python python-typing
1个回答
0
投票

这个答案

Concatenate
结合:

(游乐场链接:MypyPyright

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
的新类型。

IDE支持

VSCode/Pylance 对此有很好的支持(因为该数据直接取自 Pyright):

PyCharm,没那么多:

© www.soinside.com 2019 - 2024. All rights reserved.