Python:在字典中以字符串形式传递不等式以供评估

4 投票
2 回答
2033 浏览
提问于 2025-04-16 22:43

我需要把不等式传递给一个函数,让这个函数来评估它。有没有办法把不等式作为字符串传进去进行评估?还是说我必须传一个不等式的表示,然后用if/else语句来生成符号?

2 个回答

4

你可以使用 operator 模块,然后传入合适的方法。

import operator

def check(op, a, b)
    return op(a,b)

op = operator.ne
check(op, 2,3)


>>> True
4

你的问题有点模糊,但听起来你想要评估一个包含表达式的字符串(比如 x > 5)。与其这样做,既复杂又可能存在安全隐患,不如定义一个函数,可以用传统的方式或者用 lambda 表达式来定义。

def gt5(x):
    return x > 5

或者

gt5 = lambda x: x > 5

这两种方式是等价的;现在你可以随意传递 gt5,到时候只需要调用它就可以了。

y = 6
if gt5(y):
    ...

正如 Gerrat 的回答所提到的,operator 模块在这种情况下也可能会很有用。


现在我知道你在处理用户输入的字符串,我建议你创建一个字典,把字符串映射到函数上。(也许这就是你标题中所指的?)把用户输入的字符串传给 getattr 在很多方面都不好。如果你想添加一个字符串,但它并不是 operator 的一个属性,会发生什么?如果用户传入一个对应于私有属性的字符串,又会怎样?最好是创建一个自定义的字典,把字符串映射到函数上。字典可以让你指定只接受那些你想要的字符串。

func_dict = {
    'lt'   : operator.lt,
    'gt'   : operator.gt,
    'nand' : lambda x, y: not (x and y)
}

你仍然可以通过使用 getattroperator 从你想要接受的字符串列表中构建字典,从而省去一些工作。可以这样做:

func_dict = dict((s, getattr(operator, s)) for s in ['lt', 'gt'])

然后像这样更新 func_dict

custom_dict = {
    'nand' : lambda x, y: not (x and y)
}

func_dict.update(custom_dict)

从这里你可以很容易地调用字典中的函数,像这样:

>>> func_dict['lt'](5, 7)
True

撰写回答