【发布时间】:2022-02-25 15:31:06
【问题描述】:
假设我们有一个调用 open() 但参数固定的普通函数:
def open_for_writing(*args, **kwargs):
kwargs['mode'] = 'w'
return open(*args, **kwargs)
如果我现在尝试调用 open_for_writing(some_fake_arg = 123),没有类型检查器(例如 mypy)可以判断这是一个不正确的调用:它缺少必需的 file 参数,并且正在添加另一个不属于open签名。
如何告诉类型检查器*args 和**kwargs 必须是open 参数规范的子集?我意识到 Python 3.10 有新的 ParamSpec 类型,但它似乎不适用于这里,因为你无法获得像 open 这样的具体函数的 ParamSpec。
【问题讨论】:
-
你真的需要一个子集吗?您的示例将接受与
open相同的参数,尽管承认默默地忽略了一个。 -
@MisterMiyagi 有点像。我从该线程中得到的主要收获是我可以分配给
target.__annotations__,这是我没有意识到的。使用装饰器并不是唯一的方法。 -
复制
__annotations__仅用于运行时检查。重要的部分是装饰器本身的注解,它在函数之间复制static类型信息。
标签: python python-3.x mypy python-typing