Выполнение функций на основе пользовательской конфигурации - PullRequest
0 голосов
/ 18 апреля 2020

Я вычисляю большое количество функций в ~ 1M файлов. Пользователь может настроить, какие функции должны быть вычислены с помощью файла конфигурации yaml, например:

Features:
  Feature1:
    use: on
    params:
       (...)
  Feature2:
    use: off
    params:
       (...)
  Feature3:
    use: on
    params:
       (...)

and so on...

Я ищу способ Pythoni c (шаблон проектирования? Framework?) Для запуска только тех функций, которые пользователь включил. Функции, которые вычисляют функции, имеют одинаковую подпись, и каждая из них может принять мою конфигурацию в качестве ввода.

Самый простой способ - просто проверить внутри функции, если use установлено в True, то есть:

def compute_feature_1(signal, config):
    if config['Features']['Feature1'][use]:
        r = do_expensive_calculations()
        return r
    else: return None

Поскольку у меня будет множество таких функций, мне было интересно, есть ли способ получше, а не повторять все время if / else утверждение. Декоратор вроде?

Я придумал это:

from functools import wraps

def toggle(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        print('Calling decorated function')
        if args[1]['use']:
            return f(*args, **kwds)
        else:
            return None
    return wrapper

, который работает так:

@toggle
def compute_feature_1(signal, config):
    return 42

compute_feature_1(signal, config['Features']['Feature1'])

Проблема с этим? Он чувствует себя fr agile, то есть декоратор полагается на конфигурацию, передаваемую в качестве второго аргумента.

Лучшие идеи?

...