【问题标题】:python convert a string to an operatorpython将字符串转换为运算符
【发布时间】:2011-07-04 06:41:19
【问题描述】:

是否可以在python中将字符串转换为运算符? 我想将条件传递给函数

理想情况下应该是这样的:

def foo(self, attribute, operator_string, right_value):
    left_value = getattr(self, attribute)
    if left_value get_operator(operator_string) right_value:
         return True
    else:
         return False

bar.x = 10
bar.foo('x', '>', 10)
[out] False
bar.foo('x', '>=', 10)
[out] True

我可以制作一个字典,其中键是字符串,值是运算符模块的函数。 我将不得不稍微更改 foo 定义:

operator_dict = {'>', operator.lt,
                 '>=', operator.le}
def foo(self, attribute, operator_string, right_value):
    left_value = getattr(self, attribute)
    operator_func = operator_dict[operator_string]
    if operator_func(left_value, right_value):
         return True
    else:
         return False

这意味着我必须制作这本词典,但真的有必要吗?

【问题讨论】:

  • 只要您有一组可管理的运算符,字典就可以了。

标签: python string function


【解决方案1】:
#This is very simple to do with eval()

score=1
trigger_conditon=">="
trigger_value=4

eval(f"{score}{trigger_conditon}{trigger_value}")

#luckily fstring also takes care of int/float or relavaent datatype

operator_str="ge"
import operator
eval(f"operator.{operator_str}({score},{trigger_value})")

【讨论】:

    【解决方案2】:

    指定问题的方式我不明白为什么你不能将 operator.le 传递给函数而不是 ">="。

    如果这个 operator_string 来自数据库或文件或其他东西,或者您是否在代码中传递它?

    bar.foo('x', operator.le , 10)
    

    您只是想拥有一种方便的速记方式吗?然后你可能会做这样的事情:

    from operator import le
    bar.foo('x', le, 10)
    

    如果这里真正的问题是您有来自数据库或数据文件的代码或业务规则,那么您实际上可能需要编写一个小解析器,将您的输入映射到这些对象中,然后您可以看一下在使用 pyparsing、ply、codetalker 等库时。

    【讨论】:

    • 我只是想要一个方便的捷径。所以你的解决方案听起来也不错,谢谢。
    • 或者你可以只做from operator import eq, ne, gt, lt, le, ge 而不必为所有的人写作业。
    【解决方案3】:

    您可以使用eval 来动态构建一段 Python 代码并执行它,但除此之外没有真正的替代方案。然而,基于字典的解决方案更加优雅和安全。

    除此之外,真的那么不好吗?为什么不缩短一点……

    return operator_dict[operator_string](left_value, right_value)
    

    【讨论】:

    • 感谢您让我了解 eval。但是是的,你是对的,创建这本字典并没有那么糟糕。
    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多