首页 > 解决方案 > Python:一次用于多个参数的 TypeVar

问题描述

有没有办法让TypeVar(或其他格式)捕获函数的所有参数?例如,假设我想包装一个通用函数,使其所有参数都在一个元组中给出:

def invoke(f: Callable[..., T], args: Tuple[...]) -> T:
    return f(*args)

只有这样,而不是省略号 ( ...),我将让静态类型检查强制 的内容Tuple与函数的参数具有相同的类型。

谢谢。

标签: pythonpython-3.xtype-hinting

解决方案


您可以修改以下内容以满足您的要求,您可能需要添加额外的处理。

from typing import Any

class TypeEnforce:
    def __init__(self, func):
        self.func = func
    def __call__(self, *args):
        types = dict(zip(self.func.__annotations__.values(), args))
        for k, v in types.items():
            if k is Any:
                continue
            assert type(v) == k
        self.func(*args)

例子

@TypeEnforce
def my_test(x: str, y: int) -> None:
    print(f"'x' is a {type(x).__name__}")


@TypeEnforce
def my_other_test(x: Any):
    return x

my_test("Test", "eight")
my_other_test("Test2")

将导致一个,AssertionError因为该函数my_test接受(strint)但传递(strstr)。还有一些边缘情况,提示TypedDict总是会失败,因为它不是真正的类型,而是 a 的语法糖dict


推荐阅读