【问题标题】:Python: Pass inequality as string in dict for evaluationPython:将不等式作为字符串传递给dict以进行评估
【发布时间】:2011-08-02 13:53:42
【问题描述】:

我需要将不等式传递给函数以在函数内进行评估。如果作为字符串传递,有没有办法评估不等式?还是我必须传递不等式的表示并使用 if/else 语句来生成符号?

【问题讨论】:

  • “评估不平等”是什么意思?你能举个例子吗?

标签: python function sign inequality


【解决方案1】:

您的问题有点含糊,但听起来您想要评估包含表达式的字符串(例如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 存在于处理端?
  • @strimp099,好吧,我假设这是一个最终用户界面,而不是 API 或类似的东西。因此,鉴于这个假设,是的,func_dict 存在于处理端;用户输入一个字符串,然后将该字符串传递给 func_dict 以查找要执行的函数。 (但这可能会在用户传入字符串后立即发生,或者更晚 - 无论您的情况如何。)如果这是库模块的接口或类似的东西,那么很可能不需要完全使用字符串;你可以接受任何功能。
【解决方案2】:

您可以使用operator 模块,并在其上传递适当的方法:

import operator

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

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


>>> True

【讨论】:

  • 我最终将字符串 lt、le、eq、ge 或 gt 传递给函数,然后调用 fcn = getattr(operator, 'le') 完美运行。感谢您的回复。
  • @strimp099:那你为什么要传递一个字符串呢?只需传递operator.lt 等。
  • 界面级别的用户正在传递参数,所以我想让它更简洁一些。如果有速度提升我会考虑,我现在正在测试。好主意,谢谢。
  • @strimp099,使用getattr + operator 处理用户字符串似乎很脆弱。见我的updated answer
猜你喜欢
  • 2010-12-17
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多