Мне любопытно, можно ли взять несколько условных функций и создать одну функцию, которая проверяет их все (например, способ, которым генератор берет процедуру для итерации ряда и создает итератор).
Основной вариант использования будет, когда у вас есть большое количество условных параметров (например, "max_a", "min_a", "max_b", "min_b" и т. Д.), Многие из которых могут быть пустыми. Все они будут переданы этой функции «создания функции», которая затем вернет одну функцию, которая проверила их все. Ниже приведен пример наивного способа выполнения того, что я спрашиваю:
def combining_function(max_a, min_a, max_b, min_b, ...):
f_array = []
if max_a is not None:
f_array.append( lambda x: x.a < max_a )
if min_a is not None:
f_array.append( lambda x: x.a > min_a )
...
return lambda x: all( [ f(x) for f in f_array ] )
Что мне интересно, так это то, что наиболее эффективно для достижения того, что делается выше? Кажется, что выполнение вызова функции для каждой функции в f_array создаст приличное количество накладных расходов, но, возможно, я участвую в преждевременной / ненужной оптимизации. В любом случае, мне было бы интересно узнать, сталкивался ли кто-нибудь еще с подобными случаями использования и как они проходили.
Кроме того, если это невозможно в Python, возможно ли это в других (возможно, более функциональных) языках?
РЕДАКТИРОВАТЬ: похоже, что консенсусное решение состоит в том, чтобы составить строку, содержащую полный набор условий, а затем использовать exec или eval для генерации одной функции. @doublep предполагает, что это довольно хакерски. Есть мысли о том, как это плохо? Можно ли при составлении функции проверять аргументы достаточно близко, чтобы подобное решение можно было считать безопасным? В конце концов, все, что требуется от строгой проверки, нужно выполнить только один раз, тогда как преимущество от более быстрого комбинированного условия может быть получено при большом количестве вызовов. Люди используют подобные вещи в сценариях развертывания, или это в основном техника, с которой можно поиграть?