处理因动态将参数添加到修饰函数而导致的linter错误

时间:2019-02-26 21:53:13

标签: python python-decorators pylint

以下(简化)代码适用于FINE。简而言之:传递给我的函数的动态参数由装饰器而不是装饰的函数使用。但是我收到了这个令人讨厌的Pylint错误(“ 函数调用的位置参数太多”)。 我知道我可以在我的IDE /编辑器设置中禁用此错误(或使用pylint的内联禁用选项)。我也知道,还有其他解决方案会产生其他林特警告(例如:未使用的参数等)。

底线:如果我能一劳永逸地找出最“ Python式”的编写方式,而这不会使短毛猫感到沮丧,那将是很好的。

>
def my_decorator(func):
    ''' dummy decorator '''
    def wrapper(incoming_data):
        if incoming_data['flag']:
            # run the decorated function (NO ARGUMENTS needed):
            return func()

         # run some other code
        return "I did something ELSE"

    return wrapper


@my_decorator
def do_something():
    ''' dummy function '''
    return "I ran the decorated function"

if __name__ == '__main__':
    my_data_1 = dict(flag=True,
                     not_needed="useless_data")
    result = do_something(my_data_1)
    print(result)  # "I ran the decorated function"

    my_data_2 = dict(flag=False,
                     not_needed="useless_data")
    result = do_something(my_data_2)
    print(result)  # "I did something ELSE"

2 个答案:

答案 0 :(得分:0)

不是装饰do_something来完成其他事情,而是将 wrapper 定义为主要功能(以下称为doer),然后将适当的功能作为在需要时调用的参数。 do_something可以是默认回调。

def do_something():
    return "I'm the default callback"


def do_something_unexpected():
    return "I'm another callback"


def doer(incoming_data, callback=do_something):
    if incoming_data['flag']:
        return callback()
    return "I did something ELSE"


if __name__ == '__main__':
    my_data_1 = dict(flag=True,
                     not_needed="useless_data")
    result = doer(my_data_1)  # Call
    print(result)  # "I ran the decorated function"

    my_data_2 = dict(flag=False,
                     not_needed="useless_data")
    result = doer(my_data_2, do_something_unexpected)
    print(result)  # "I did something ELSE"

答案 1 :(得分:0)

使用一个参数定义track_errors,以匹配其用法。不需要装饰器。

do_something