函数的类型注释,返回带参数和kwargs的函数

时间:2018-09-09 11:43:16

标签: python python-3.x static-typing mypy type-annotation

以下示例代码在运行时有效,但 My actual versions are: Package Version ------------------------------------------------------ @angular-devkit/architect 0.8.1 @angular-devkit/core 0.8.1 @angular-devkit/schematics 0.8.1 @angular/cdk 6.2.1 @angular/cli 6.2.1 @angular/material 6.2.1 @schematics/angular 0.8.1 @schematics/update 0.8.1 rxjs 6.3.2 typescript 2.9.2 不接受:

mypy --strict

from typing import Any, Callable, TypeVar TypeT = TypeVar('TypeT') def log_call(msg: str) -> Callable[..., TypeT]: def do_call(func: Callable[..., TypeT], *args: Any, **kwargs: Any) -> TypeT: print(msg) return func(*args, **kwargs) return do_call def double(val: int) -> int: return 2 * val def plus(a: int, b: int) -> int: return a + b def plus_plus(a: int, b: int, c: int) -> int: return a + b + c result_1 = log_call('hi')(double, 1) result_2 = log_call('hi')(plus, 2, 3) result_3 = log_call('hi')(plus_plus, 2, 3, 4) result_4 = log_call('hi')(double, val=1) print(result_1) print(result_2) print(result_3) print(result_4) 输出:

mypy

现在,我不想将类型注释添加到test.py:26: error: Need type annotation for 'result_1' test.py:27: error: Need type annotation for 'result_2' test.py:28: error: Need type annotation for 'result_3' test.py:30: error: Need type annotation for 'result_4' test.py:32: error: Cannot determine type of 'result_1' test.py:33: error: Cannot determine type of 'result_2' test.py:34: error: Cannot determine type of 'result_3' test.py:35: error: Cannot determine type of 'result_4' 变量中,而是要调整函数的类型注释,以便可以推导出其他注释。这是我的尝试:

result*

但是现在参数的数量不再适合了

from typing import Any, Callable, TypeVar

TypeT = TypeVar('TypeT')


def log_call(msg: str) -> Callable[[Callable[..., TypeT], Any, Any], TypeT]:
    def do_call(func: Callable[..., TypeT], *args: Any, **kwargs: Any) -> TypeT:
        print(msg)
        return func(*args, **kwargs)

    return do_call


def double(val: int) -> int:
    return 2 * val


def plus(a: int, b: int) -> int:
    return a + b


def plus_plus(a: int, b: int, c: int) -> int:
    return a + b + c


result_1 = log_call('hi')(double, 1)
result_2 = log_call('hi')(plus, 2, 3)
result_3 = log_call('hi')(plus_plus, 2, 3, 4)

result_4 = log_call('hi')(double, val=1)

print(result_1)
print(result_2)
print(result_3)
print(result_4)

我想我正在寻找类似的东西

test.py:26: error: Too few arguments
test.py:28: error: Too many arguments
test.py:30: error: Unexpected keyword argument "val"

但是此语法不合法。

有没有办法解决这个问题?

0 个答案:

没有答案