我很好奇是否可以采用多个条件函数并创建一个函数来检查所有这些函数(例如,生成器采用迭代一系列过程并创建迭代器的方式)。
基本用法是当您有大量条件参数(例如“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 表明这非常hackish。你有什么想法这有多糟糕吗?在编写函数时是否可以足够仔细地检查参数,这样的解决方案可以被认为是安全的?毕竟,无论需要什么严格的检查都只需要执行一次,而更快的组合条件的好处可以通过大量的调用来获得。人们是否在部署场景中使用这样的东西,或者这主要是一种可以使用的技术?
最佳答案
更换
return lambda x: all( [ f(x) for f in f_array ] )
与
return lambda x: all( f(x) for f in f_array )
将提供更高效的lambda
,因为如果任何f
返回错误值,它将提前停止,并且不需要创建不必要的列表。不过,这只能在 Python 2.4 或 2.5 及更高版本上实现。如果您需要支持古老的值(value)观,请执行以下操作:
def check (x):
for f in f_array:
if not f (x):
return False
return True
return check
最后,如果您确实需要使其非常高效并且不害怕限制黑客解决方案,您可以尝试在运行时编译:
def combining_function (max_a, min_a):
constants = { }
checks = []
if max_a is not None:
constants['max_a'] = max_a
checks.append ('x.a < max_a')
if min_a is not None:
constants['min_a'] = min_a
checks.append ('x.a > min_a')
if not checks:
return lambda x: True
else:
func = 'def check (x): return (%s)' % ') and ('.join (checks)
exec func in constants, constants
return constants['check']
class X:
def __init__(self, a):
self.a = a
check = combining_function (3, 1)
print check (X (0)), check (X (2)), check (X (4))
请注意,在 Python 3.x 中 exec
成为一个函数,因此上面的代码不可移植。
关于python - 你能在Python中动态地将多个条件函数组合成一个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3010381/