Как параметризовать или сделать функции универсальными в Python? - PullRequest
0 голосов
/ 16 октября 2018

Я использую библиотеку Python (APScheduler), которая требует некоторых обработчиков функций.Все эти функции обработчиков практически одинаковы.Единственное отличие - это «константа» (т. Е. Логика одинакова; отличается только константа, используемая для ссылки на некоторые структуры данных).

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

В Javascript это будет возможно так:

function staticFunction(args) {
    // ... this function I have to parameterise
};

function factory(type) {
    return function(args) {
        // ... this function is parametrised with "type"
    };
}

addHandler(staticFunction)
addHandler(factory("apples"));
addHandler(factory("oranges"));

Как мне сделать то же самое в Python?

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете сделать то же самое в Python;Вы можете создать вложенную функцию, которая будет иметь доступ к type в качестве замыкания:

def factory(type):
    def nested(args):
        # do something with `type`
    return nested

add_handler(factory('apples'))

Есть еще несколько способов привязать параметр к вызываемой;вы можете использовать lambda для прокси вызова функции:

def static_function(type, args):
    # ...

add_handler(lambda args: static_function('apples', args))

или вы можете использовать functools.partial() объект для привязки аргументов к вызываемому:

from functools import partial

add_handler(partial(static_function, 'apples'))
...