按字符串名称以编程方式查找运算符

bla*_*ite 2 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. >=, <=, !=
Run Code Online (Sandbox Code Playgroud)

我怎样才能以编程方式更好地提炼出来呢?我正在考虑创建这样的查找:

op_lookup = {'eq': '==', 'gt': '>', 'lt': '<', ...}
Run Code Online (Sandbox Code Playgroud)

然后做这样的事情:

def process(x, y, op):
    return x op_lookup[op] y
Run Code Online (Sandbox Code Playgroud)

哪个显然不是有效的Python ...

eval可能有用的东西:

def process(x, y, op):
    return eval('{} {} {}'.format(x, op_lookup[op], y))
Run Code Online (Sandbox Code Playgroud)

在一个例子中产生这个:

>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False
Run Code Online (Sandbox Code Playgroud)

是否有更好(更安全?)的方式来实现这一目标?

tim*_*geb 6

作为可调用的运算符隐藏在operator模块中.您可以使用getattr内置的名称动态访问特定运算符.

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我们可以使用它来重写您的函数,如下所示.

import operator

def process(x, y, op):
    return getattr(operator, op)(x, y)
Run Code Online (Sandbox Code Playgroud)

(根据需要添加健全性检查.)