Я вычисляю большое количество функций в ~ 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, то есть декоратор полагается на конфигурацию, передаваемую в качестве второго аргумента.
Лучшие идеи?