【发布时间】:2011-08-02 13:53:42
【问题描述】:
我需要将不等式传递给函数以在函数内进行评估。如果作为字符串传递,有没有办法评估不等式?还是我必须传递不等式的表示并使用 if/else 语句来生成符号?
【问题讨论】:
-
“评估不平等”是什么意思?你能举个例子吗?
标签: python function sign inequality
我需要将不等式传递给函数以在函数内进行评估。如果作为字符串传递,有没有办法评估不等式?还是我必须传递不等式的表示并使用 if/else 语句来生成符号?
【问题讨论】:
标签: python function sign inequality
您的问题有点含糊,但听起来您想要评估包含表达式的字符串(例如x > 5)。而不是这样做,这不必要地复杂,并且可能存在安全隐患,只需定义一个函数,或者以传统方式或使用 lambda。
def gt5(x):
return x > 5
或
gt5 = lambda x: x > 5
这些都是等价的;现在你可以随心所欲地传递gt5,到时候你只需调用它
y = 6
if gt5(y):
...
正如Gerrat's 答案所暗示的,operator 模块也可能对此类事情有用。
既然我知道您正在处理用户字符串,我肯定会建议创建一个将字符串映射到函数的字典。 (也许这就是您在标题中的意思?)将用户空间字符串传递给getattr 在很多方面似乎都不好。如果您想添加一个与operator 属性不对应的字符串,会发生什么情况?如果用户传入一个对应于私有属性的字符串会发生什么?最好创建一个自定义字典,将字符串映射到函数。 dict 允许您仅指定要接受的那些字符串。
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
【讨论】:
func_dict 存在于处理端;用户输入一个字符串,然后将该字符串传递给 func_dict 以查找要执行的函数。 (但这可能会在用户传入字符串后立即发生,或者更晚 - 无论您的情况如何。)如果这是库模块的接口或类似的东西,那么很可能不需要完全使用字符串;你可以接受任何功能。
您可以使用operator 模块,并在其上传递适当的方法:
import operator
def check(op, a, b)
return op(a,b)
op = operator.ne
check(op, 2,3)
>>> True
【讨论】:
operator.lt 等。
getattr + operator 处理用户字符串似乎很脆弱。见我的updated answer。