Работа с ошибками линтера, вызванными динамическим добавлением параметров в декорированные функции - PullRequest
0 голосов
/ 27 февраля 2019

Приведенный ниже (упрощенный) код работает FINE.В двух словах: динамический аргумент, передаваемый моей функции, используется декоратором, а НЕ декорированной функцией.Но я получаю эту досадную ошибку Pylint (" Слишком много позиционных аргументов для вызова функции "). Я знаю, что могу отключить эту ошибку в настройках своего IDE / редактора (или используя опцию отключения inline Pylint) .Я также знаю, что есть и другие решения, которые генерируют другие предупреждения linter (например, неиспользуемый аргумент и т. Д.).

Итог: было бы здорово, если бы я мог понять, один раз идля всех, самый "Pythonic способ" написать это способом, который не расстраивает линтера.

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 голосов
/ 27 февраля 2019

Определите do_something с одним параметром, чтобы соответствовать тому, как он будет использоваться.Декоратор не нужен.

def actually_do_something()
    return "I did something"

def do_something(incoming_data):
    if incoming_data['flag']:
        return actually_do_something()
    return "I did something else"
0 голосов
/ 27 февраля 2019

Вместо того, чтобы украшать do_something, чтобы сделать, ну что-то еще, определить вашу оболочку в качестве основной функции (называемой 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"
...