V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
banjintaohua
V2EX  ›  Python

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

  •  
  •   banjintaohua · 2021-05-28 14:36:05 +08:00 · 1525 次点击
    这是一个创建于 1035 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下例子:

    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)
    
    
    第 1 条附言  ·  2021-05-28 15:18:40 +08:00

    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()
    
    第 2 条附言  ·  2021-05-28 15:21:42 +08:00
    已使用 2L 老哥的方法成功解决问题
    4 条回复    2021-05-28 16:12:26 +08:00
    Namek77
        1
    Namek77  
       2021-05-28 15:02:55 +08:00
    最后说明是哪个 IDE,实测 Pycharm 都会提示 param1, param2
    abersheeran
        2
    abersheeran  
       2021-05-28 15:04:03 +08:00   ❤️ 2
    ```python
    T = typing.TypeVar("T")

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

    这么写 Type hint 就行了。
    banjintaohua
        3
    banjintaohua  
    OP
       2021-05-28 15:20:03 +08:00
    @abersheeran 使用 @abersheeran 2L 老哥的方法解决问题,感谢
    imn1
        4
    imn1  
       2021-05-28 16:12:26 +08:00
    @abersheeran #2
    这么简单啊?我自己写了个 typehints 检查,老长,再去理解一下
    有些参数格式是迭代器,老是忘记传了 str 过去,偏偏 str 也能迭代……想写一个自动转换的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:06 · PVG 05:06 · LAX 14:06 · JFK 17:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.