python - Python:一次用于多个参数的 TypeVar
问题描述
有没有办法让TypeVar
(或其他格式)捕获函数的所有参数?例如,假设我想包装一个通用函数,使其所有参数都在一个元组中给出:
def invoke(f: Callable[..., T], args: Tuple[...]) -> T:
return f(*args)
只有这样,而不是省略号 ( ...
),我将让静态类型检查强制 的内容Tuple
与函数的参数具有相同的类型。
谢谢。
解决方案
您可以修改以下内容以满足您的要求,您可能需要添加额外的处理。
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
接受(str
,int
)但传递(str
,str
)。还有一些边缘情况,提示TypedDict
总是会失败,因为它不是真正的类型,而是 a 的语法糖dict
。
推荐阅读
- android - Onclick 不调用 Main Activity 之外的方法
- javascript - 使用 jquery 一段时间后关闭 Zurb Foundation 中的标注消息
- python - 如何仅选择 Tensorflow 数据集的一部分,并更改维度
- javascript - 如何在其他脚本之前执行 chrome 扩展脚本?
- axapta - 从同一字段 AX 2012 转到不同的主表
- python - Python正则表达式分组帮助请
- graylog - 配置 Graylog 仪表板小部件以链接到查询
- kubernetes - 将微服务应用部署到清晰的 Kubernetes 集群
- css - 在 h1 标签之后直接将样式应用于 p 标签,直到它碰到另一个 h 标签?
- data-analysis - Apache Superset 用作 OLAP 工具