如何消除PyCharm对仅被装饰器使用的函数参数的未使用警告?
我有多个作为RPC调用的函数,执行主任务前需要完成准备工作,执行后还要进行清理操作。这些函数的前两个参数logname和password用于设置用户数据(如属性、权限等)。
我编写了@rpc_wrapper装饰器来处理这些通用逻辑,已经稳定运行一年有余,但PyCharm的inspect code功能(其他代码检查工具大概率也会出现类似情况)会发出警告,提示logname和password参数未在函数内部使用,仅被装饰器调用。
我曾尝试在每个函数开头添加assert (logname, password)来规避警告,但这种方式违背了装饰器减少重复代码的设计初衷,请问有没有更简洁的解决方案?
附简化版装饰器代码:
from functools import wraps import logging def rpc_wrapper(func): @wraps(func) def wrapper(login=None, pwd=None, *args, **kwargs): doCleanup = True try: doCleanup = setupUser(login, pwd) return func(login, pwd, *args, **kwargs) except Exception: logging.exception('**<#>') raise Exception('999: internal error') finally: if doCleanup: cleanup() return wrapper
示例装饰函数:
@rpc_wrapper def ping(login: str = None, pwd: str = None): return 'pong'
另一个示例:
@rpc_wrapper def echo(login: str = None, pwd: str = None, msg: Any = 'message'): return msg
可行解决方案
方案1:修改装饰器,剥离业务函数的登录参数
既然登录参数仅在装饰器中处理,业务函数本身不需要使用,可直接修改装饰器,不再将login和pwd传递给业务函数。同时调整业务函数的签名,移除这两个参数,从根源上消除警告。
修改后的装饰器:
from functools import wraps import logging def rpc_wrapper(func): @wraps(func) def wrapper(login=None, pwd=None, *args, **kwargs): doCleanup = True try: doCleanup = setupUser(login, pwd) # 不再传递login和pwd给业务函数 return func(*args, **kwargs) except Exception: logging.exception('**<#>') raise Exception('999: internal error') finally: if doCleanup: cleanup() return wrapper
调整后的业务函数:
@rpc_wrapper def ping(): return 'pong' @rpc_wrapper def echo(msg: Any = 'message'): return msg
这种方式让业务函数更简洁,且完全符合装饰器“封装通用逻辑”的设计初衷,RPC调用时仍正常传递login和pwd即可。
方案2:用下划线命名标记“有意忽略”的参数
如果RPC框架要求业务函数必须保留参数签名,可以将参数名改为_login、_pwd(或前缀加下划线),代码检查工具通常会识别这是开发者有意忽略的参数,不会触发未使用警告。
示例:
@rpc_wrapper def ping(_login: str = None, _pwd: str = None): return 'pong' @rpc_wrapper def echo(_login: str = None, _pwd: str = None, msg: Any = 'message'): return msg
方案3:用*吸收未使用参数
在业务函数定义中使用*_吸收前面的位置参数(即login和pwd),**__吸收额外关键字参数,既保留参数位置兼容性,又不会触发警告:
@rpc_wrapper def ping(*_, **__): return 'pong' @rpc_wrapper def echo(*_, msg: Any = 'message', **__): return msg
方案4:添加特定注释抑制警告
如果不想修改装饰器或函数签名,可在函数内部添加代码检查工具支持的注释来抑制警告。比如PyCharm支持# noinspection PyUnusedLocal:
@rpc_wrapper def ping(login: str = None, pwd: str = None): # noinspection PyUnusedLocal return 'pong'
不过这种方式仍需在每个函数中添加注释,重复度较高,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Volker Böhm

