在 Python 中,是否存在使用具有仅用于方法装饰器的参数的方法的通用模式?

In Python, is there a common pattern to using methods that have arguments that are only used a method's decorator?

目标

在一个方法上有一个类型提示参数,该参数不会被像 pylint 这样的 linters 捕获为未使用。

上下文

我们在装饰器中使用了一个名为 context 的参数。

解决方案

当前解决方案

截至今天,我们只是将 arg 传递给装饰方法,即使方法本身没有声明这个 arg,我们让装饰器从 args 集合中删除这个 arg,这样当 func 实际上是在装饰器中调用,arg 不存在,从而避免了问题。

def wrapper(func):
    @functools.wraps(func)
    def handler(*args, **kwargs):
        
        # Here we run our logic that used the arg passed in when calling the method

        # Since the method itself doesn't need this arg, we remove it
        try:
            del kwargs['context']
        except KeyError:
            pass

        return func(*args, **kwargs)

     return handler

缺点

这样做是消除了我们键入提示或提供此附加参数作为文档化参数的能力(阅读:通过 IDE 提示或自动文档记录为可用)。

优点

Pylint 和其他 linters 让我们不用在任何地方添加异常:)

上一个解决方案

我们在采用当前解决方案之前的另一个解决方案是简单地执行如下操作:

@wrapper
def my_method(arg1: str, arg2: str, dec_arg: bool):
    _ = dec_arg
    print(arg1)
    print(arg2)

缺点

优点

最后的笔记

虽然在类型提示方面不是最佳选择,但我可以接受当前的解决方案,我只是想确保我不会错过以更好的方式做某事:)

提前致谢!

仅仅因为它是可选的并不意味着您不能显式声明它。

def wrapper(func):
    @functools.wraps(func)
    def handler(*args, context: str = None, **kwargs):
        
        # Here we run our logic that used the arg passed in when calling the method

        return func(*args, **kwargs)

     return handler

这使得 context 成为一个可选的 keyword-only 参数,它没有被 kwargs 捕获。