社区首页 >问答首页 >如何注释转发到另一个函数的参数类型?

如何注释转发到另一个函数的参数类型?
EN

Stack Overflow用户
提问于 2022-02-24 06:27:21
回答 1查看 582关注 0票数 9

假设我们有一个调用open()的平凡函数,但是有一个固定的参数:

代码语言:javascript
代码运行次数:0
复制
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参数规范的子集?我知道Python3.10有新的ParamSpec类型,但是它在这里似乎不适用,因为您无法获得像open这样的具体函数的ParamSpec

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 23:25:26

我认为这不可能。但是,您可以编写一个装饰器,它将包含要检查的参数的函数(在您的情况下是打开的)作为输入,并返回修饰函数,即在您的情况下是open_for_writing。当然,这只适用于python3.10或使用typing_extensions,因为它使用了ParamSpec

代码语言:javascript
代码运行次数:0
复制
from typing import TypeVar, ParamSpec, Callable, Optional

T = TypeVar('T')
P = ParamSpec('P')


def take_annotation_from(this: Callable[P, Optional[T]]) -> Callable[[Callable], Callable[P, Optional[T]]]:
    def decorator(real_function: Callable) -> Callable[P, Optional[T]]:
        def new_function(*args: P.args, **kwargs: P.kwargs) -> Optional[T]:
            return real_function(*args, **kwargs)

        return new_function
    return decorator

@take_annotation_from(open)
def open_for_writing(*args, **kwargs):
    kwargs['mode'] = 'w'
    return open(*args, **kwargs)


open_for_writing(some_fake_arg=123)
open_for_writing(file='')

这里所示,mypy现在抱怨有一个未知的论点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71253495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档