可以将集合运算符(操作)作为字符串参数传递给函数吗?
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}
(我知道,那是 无聊 ;-)
我的问题将通过以下伪示例代码轻松理解:
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}
(我知道,那是 无聊 ;-)