python - 你能在Python中动态地将多个条件函数组合成一个吗?

标签 python functional-programming

我很好奇是否可以采用多个条件函数并创建一个函数来检查所有这些函数(例如,生成器采用迭代一系列过程并创建迭代器的方式)。

基本用法是当您有大量条件参数(例如“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/

相关文章:

functional-programming - 二进制字符串erlang的第一个字

haskell - 合并 Haskell 中相似的列表列表

python - 扩展 Cython 类时,__cinit__() 恰好需要 2 个位置参数

python - readthedocs 上的 nbsphinx 语法突出显示

python - 从今天到给定日期还有多少天

algorithm - 找到除以haskell的阶乘的数字的最大幂

programming-languages - 各种函数式语言的优点/缺点是什么?

Python:我可以使用初始化器部分应用reduce吗?

python - 如何根据 PySpark 中的数组值进行过滤?

Python 重定向标准输入