可以将集合运算符(操作)作为字符串参数传递给函数吗?

Possible to pass set operators (operation) as a string argument to a function?

我的问题将通过以下伪示例代码轻松理解:

def set_operation(a,b,c,operation):
    stringrun(operation)  # stringrun is the pseudo element here ;)

set_operation(set([1,2,3]),set([4,5,6]),set([3,4]), "(a|b)^c")
>>> set([1,2,5,6])

所以我想要的是一种如此简单的方法,不必编写一堆代码来分析 operation-string char-per-char 并获取我的最终结果有足够的 fors, ifs 和函数 .union, .intersection
相反,如果我可以将设置操作命令直接传递给我想使用它的函数,那将是非常优雅的。

有办法吗?

这是非常糟糕的设计,但是您要求的是:

def do_string(a, b, c, op_string):
    return eval(op_string)

a = set([1,2,3])
b = set([4,5,6])
c = set([3,4])
print(do_string(a, b, c, "(a|b)^c"))  # =>  {1, 2, 5, 6}

# be aware! arguments are passed POSITIONALLY, not by name!
print(do_string(b, c, a, "(a|b)^c"))  # =>  {1, 2, 4, 5, 6}  !not what you expected!

一种更安全的方法:

def do_fn(a, b, c, op_fn):
    return op_fn(a, b, c)

print(do_fn(a, b, c, (lambda a, b, c: (a | b) ^ c)))  # => {1, 2, 5, 6}

或者你可以只写:

def my_fn(a, b, c):
    return (a | b) ^ c

print(my_fn(a, b, c))     # => {1, 2, 5, 6}

(我知道,那是 无聊 ;-)