Метод, который принимает метод в качестве параметра с необязательным параметром - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть два метода из библиотеки, которые работают одинаково. Разница в том, что каждый принимает дополнительный, необязательный параметр. Например:

def method1(a, b, c):
    ...

def method2(a, b, c, d=None):
    ...

Я должен выполнить ту же задачу с результатами этих методов, поэтому у меня есть метод, который объединяет их, который выглядит следующим образом:

def wrapper(method, a, b, c, d=None):

    ...

    if d:
        results = method(a, b, c, d=d)
    else:
        results = method(a, b, c)

    ...

Это работает, но когда я добавляю больше методов, которые имеют разные необязательные аргументы, это становится громоздким. Есть ли способ лучше обработать эти параметры?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Для функции обертки я решил сделать что-то вроде следующего, как предложено в комментариях:

def wrapper(method, *args):

    ...

    results = method(*args)

    ...

Обработка ошибок должна быть включена, чтобы убедиться, что передаются правильные аргументы, как это предлагается в другом ответе.

0 голосов
/ 09 ноября 2018

Вот код, который может выполнить то, что вы ищете.

Вы можете передать набор методов в wrapper, и эта функция вернет значение любого метода, аргументы ключевого слова которого сопоставлены с kwargs.

def method1(a, b, c):
    return a, b, c


def method2(a, b, c, d=None):
    return a, b, c, d

methods = (
    method1,
    method2,
) # Collection of methods to run.

def wrapper(kwargs, methods=methods):
    """Loop over methods with kwargs."""
    for method in methods:
        try: # Call method with **kwargs
            return method(**kwargs) # Return value if keys in kwargs fit signature of method.
        except TypeError as err: # Handle error if keyword args don't match.
            print(f'err "{err}" for method "{method}')

kwargs_collection = (dict(zip(args, (f'value for arg: "{arg}"' for arg in args)))
                     for args in ('abcd', 'abc', ))




for test_kwargs in kwargs_collection:
    print(wrapper(test_kwargs))

OUTPUT

err "method1 () получил неожиданный аргумент ключевого слова 'd' для метода" function method1 в 0x7f900c2b7d90 "

('значение для arg: "a"', 'значение для arg: "b" "," значение для arg: "c"', "значение для arg:" d "')

('значение для arg: "a" "," значение для arg: "b" "," значение для arg: "c"')

...