Python 按字符串名称以编程方式查找运算符
假设我有以下代码:Python 按字符串名称以编程方式查找运算符,python,operators,Python,Operators,假设我有以下代码: def process(x, y, op): if op == 'eq': return x == y elif op == 'gt': return x > y elif op == 'lt': return x < y ... for many more operators, e.g. >=, <=, != 哪个显然是无效的 类似于eval的方法可能会起作用: def
def process(x, y, op):
if op == 'eq':
return x == y
elif op == 'gt':
return x > y
elif op == 'lt':
return x < y
... for many more operators, e.g. >=, <=, !=
哪个显然是无效的
类似于eval
的方法可能会起作用:
def process(x, y, op):
return eval('{} {} {}'.format(x, op_lookup[op], y))
在一个例子中,这产生了:
>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False
是否有更好(更安全)的方法来实现这一点?模块就是您想要的:
>>> import operator
>>> op_lookup = {'eq': operator.eq, 'gt': operator.gt, 'lt': operator.lt}
>>>
>>> def process(x, y, op):
... return op_lookup[op](x, y)
...
>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False
作为可调用项的运算符隐藏在模块中。您可以通过内置的名称动态访问特定的运算符 演示: 我们可以用它重写函数,如下所示
import operator
def process(x, y, op):
return getattr(operator, op)(x, y)
(根据需要添加健全性检查。)有趣——我没有想过访问这样一个模块的属性。我想在Python中,一切都是一个对象。。。(
type(operator)
)@blacksite是的,Python在这方面非常一致。
>>> import operator
>>> op_lookup = {'eq': operator.eq, 'gt': operator.gt, 'lt': operator.lt}
>>>
>>> def process(x, y, op):
... return op_lookup[op](x, y)
...
>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False
>>> import operator
>>> getattr(operator, 'eq')(1, 1)
True
>>> getattr(operator, 'eq')(1, 2)
False
>>> getattr(operator, 'lt')(1, 2)
True
>>> getattr(operator, 'lt')(2, 1)
False
import operator
def process(x, y, op):
return getattr(operator, op)(x, y)