如下例子:
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)
IDE 是 2021.1 版本的 pycharm
如果是单纯按 F1 或者鼠标悬浮在 bar() 方法上面,是可以显示「param1, param2」
但是如果在编码的场景,在 bar() 的括号内使用快捷键 Command + P (windows 应该是 Ctrl + P)出现的参数提示是「*args, **kwargs」
如下例子,键入 bar() 没有任何提示,按快捷键 Command + P 提示的参数是被装饰器装饰后的参数 *args, **kwargs
if __name__ == '__main__':
    bar()
如果键入 foo 就有悬浮的智能提示了, 按快捷键 Command + P 也会提示方法的参数是 param1, param2
if __name__ == '__main__':
    foo()
|      1Namek77      2021-05-28 15:02:55 +08:00 最后说明是哪个 IDE,实测 Pycharm 都会提示 param1, param2 | 
|  |      2abersheeran      2021-05-28 15:04:03 +08:00  2 ```python T = typing.TypeVar("T") def validate_params(func: T) -> T: .............. ``` 这么写 Type hint 就行了。 | 
|  |      3banjintaohua OP @abersheeran 使用 @abersheeran 2L 老哥的方法解决问题,感谢 | 
|  |      4imn1      2021-05-28 16:12:26 +08:00 |