Python:在字典中以字符串形式传递不等式以供评估
我需要把不等式传递给一个函数,让这个函数来评估它。有没有办法把不等式作为字符串传进去进行评估?还是说我必须传一个不等式的表示,然后用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)
}
你仍然可以通过使用 getattr
和 operator
从你想要接受的字符串列表中构建字典,从而省去一些工作。可以这样做:
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