关于 Python 装饰器校验参数的智能提示

2021-05-28 14:36:05 +08:00
 banjintaohua

如下例子:

foo() 方法没有使用装饰器进行参数校验,这个时候 IDE 的参数智能提示会告诉我参数是 param1, param2

bar() 方法使用了装饰器就行参数校验,这个时候 IDE 的参数智能提示变成了被装饰后的方法 validate,IDE 告诉我参数是 *args, **kwargs

请问有什么办法可以让使用了装饰器之后 IDE 还是按照原方法的参数进行提示呢?

from functools import wraps


def validate_params(func):
    """
    入参格式校验
    """

    @wraps(func)
    def validate(*args, **kwargs):
        invalid_params = [key for key, value in kwargs.items() if value is None]
        if invalid_params:
            print('%s 参数非法' % str.join(',', invalid_params))
        return func(*args, **kwargs)

    return validate


def foo(param1, param2):
    # 有什么办法可以让使用了装饰器之后 IDE 的参数提示是「 param1, param2 」
    pass


@validate_params
def bar(param1, param2):
    pass


if __name__ == '__main__':
    foo(param1='IDE 智能提示:「 param1, param2 」', param2='没有使用装饰器进行参数校验')
    bar(param1='IDE 智能提示:「*args, **kwargs 」', param2=None)

1566 次点击
所在节点    Python
4 条回复
Namek77
2021-05-28 15:02:55 +08:00
最后说明是哪个 IDE,实测 Pycharm 都会提示 param1, param2
abersheeran
2021-05-28 15:04:03 +08:00
```python
T = typing.TypeVar("T")

def validate_params(func: T) -> T: ..............
```

这么写 Type hint 就行了。
banjintaohua
2021-05-28 15:20:03 +08:00
@abersheeran 使用 @abersheeran 2L 老哥的方法解决问题,感谢
imn1
2021-05-28 16:12:26 +08:00
@abersheeran #2
这么简单啊?我自己写了个 typehints 检查,老长,再去理解一下
有些参数格式是迭代器,老是忘记传了 str 过去,偏偏 str 也能迭代……想写一个自动转换的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779822

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX