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)