Python比较评估器替换

时间:2016-10-31 21:21:20

标签: python python-3.x

我想根据字符串的上下文替换比较标记。我正在使用Python 3.5上的PyQt5实验来完成它。

例如:

line = "<"

if 1 line 2:
    print("False")

有没有简单的方法可以做到这一点?我考虑过使用测试用例:

if line == "<":
    if 1 < 2:
        print("False")

等等,但这很长,特别是对于迭代的“if”语句。 例:

if pt1 < pt1_target:
    if pt2 > pt2_target:
        etc.

或者,如果这是不可能的,有没有人有任何解决方案来避免每个分支的大量,全部“if”语句块?我打算放入一些指令,因此line最终会替换正确的python等价物,例如"="而不是正确的"=="

提前致谢!

2 个答案:

答案 0 :(得分:3)

使用operator模块中的功能:

from operator import eq, ne, lt, le, gt, ge

operator_functions = {
    '=': eq,
    '!=': ne,
    '<': lt,
    '<=': le,
    '>': gt,
    '>=': ge,
}

operator = # whatever

if operator_functions[operator](a, b):
    do_whatever()

答案 1 :(得分:2)

您可以使用字典将运算符字符串映射到operator模块中的相应函数:

import operator

ops = {'>': operator.gt,
       '<': operator.lt,
       '==': operator.eq,
       # etc...
      }

op_string = '<'
if ops[op_string](1, 2):
    print('True')
# or this...
print(ops[op_string](1, 2))

请注意,此示例打印True。您的示例似乎否定了1 < 2将评估为False的逻辑 - 如果这是您想要的,那么您可以切换逻辑:

if ops[op_string](1, 2):
    print 'False'
# or this...
print(not ops[op_string](1, 2))

或者您可以更改运算符映射:

ops = {'<': operator.ge, ...}
print(ops[op_string](1, 2))
# False