Python 从字符串应用比较运算符

Python 从字符串应用比较运算符,python,comparison,Python,Comparison,我有一个类Foo,它包含一个数学比较操作op作为字符串:或'='。Foo还包含一个数字val Foo类: 定义初始化自身,操作:str,值:int: self.op=操作 self.val=值 在我的代码中,我从输入中读取一个数字,并使用Foo的包含操作将其与Foo的类示例值进行比较: f=Foo'这将与eval一起工作。但必须谨慎使用eval!请参阅本文,了解更安全的方法,首先使用ast.literal\u eval进行解析。 更安全的方法可能不再算作更简单或更优雅 Foo类: 定义初始化自

我有一个类Foo,它包含一个数学比较操作op作为字符串:或'='。Foo还包含一个数字val

Foo类: 定义初始化自身,操作:str,值:int: self.op=操作 self.val=值 在我的代码中,我从输入中读取一个数字,并使用Foo的包含操作将其与Foo的类示例值进行比较:

f=Foo'这将与eval一起工作。但必须谨慎使用eval!请参阅本文,了解更安全的方法,首先使用ast.literal\u eval进行解析。

更安全的方法可能不再算作更简单或更优雅

Foo类: 定义初始化自身,操作:str,值:int: self.op=操作 self.val=值
f=Foo'这更优雅,效果也很好:

class Foo:

    def __init__(self, op: str, val: int):
        self.op = op
        self.val = val

    def check(self, other):
        if isinstance(other, (int, float)):
            if self.op == '<': return self.val > other
            if self.op == '>': return self.val < other
            if self.op == '=': return self.val == other
            if self.op == '!=': return self.val != other
            if self.op == '>=': return self.val <= other
            if self.op == '<=': return self.val >= other
        return NotImplemented
这个条件是正确的,因为14小于15。另一种选择是:如果我在程序中使用Foo类,我想我会使用@S-c-r-a-t-c-h-y的方法。但这里有一个可能是优雅的方法,使用比较运算符的函数形式

Foo类: 定义初始化自身,操作:str,值:int: self.op=操作 self.val=值 f=Foo:operator.gt,
“Python内置了这样的功能。我们可以超越它们

Foo类: 定义初始化自身,操作:str,值:int: self.op=操作 自我价值=价值 定义报告自我: 返回f{self.\uuuuu类{uuuuu名{self.value}{self.op}input\ux 定义自身,输入值: 返回self.value<输入值 定义自身,输入值: 返回self.value输入值 def _ge__self,输入值: 返回self.value>=输入值 def checkself,输入值:int: 操作={'=':self.\uuu ge\uuu} 返回操作.getself.op输入值 演示 f=Foo>=,15 printf Foo15>=输入 f、 支票14 符合事实的 f、 支票16 错误的 f>16 错误的 f>14 符合事实的
谢谢你的回答,但我也认为存储操作不像字符串,而是lambda。对我来说,这似乎是一个不错的解决方案:

小于=λx,y:x您可能可以使用ast.literal\u eval将其作为字符串进行计算:虽然没有一致意见,但有时会对多个返回语句表示厌恶:。然而,这在可读性方面得到了额外的分数。if isinstanceother,int或isinstanceother,float:可以减少为if isinstanceother,int,float:-将针对给定的每个类型。2.如果val不是int或float,请不要返回False,它应该是。谢谢让我知道!我不知道这是一件事。我把它修好了这也是一个很好的方法。您可以使用operator.gt和operator.eq,而不是使用lambdas。聪明的方法使其更简单。虽然我认为这是一个有点像uuu lt_uu_u_u_u u u u u u u u u u u u u。如果我们比较不同的Foo实例化,比如f1=Foo;f2=Foo;f1>f2。在这种情况下,我只会使def _等私有函数小于或使用操作符。lt。现在,我修复了;但它仍然是一种黑客行为
f = Foo('<', 15)
if f.check(14):
    print('ok')