我想知道超级强大的python是否允许在变量中存储比较,或者如果不存在,是否可以在作为字符串给出时调用/执行比较(“==”或“!= “)
我想让我的程序用户有机会在字符串中进行比较。
例如,假设我有一个......“产品”列表,用户想要选择制造商为“foo”的产品。他可以输入如下内容: Product.manufacturer ==“foo” 如果用户想要制造商不是“bar”的产品,他会输入 Product.manufacturer!=“bar”
如果用户将该行输入为字符串,我将创建一个结构如下的树
!=
/ \
manufacturer bar
我想让比较正常运行,但如果!= 是一个字符串,我不知道如何实现。
“manufacturer”字段是一个属性,所以我可以从 Product 类中正确地获取它并将它(作为属性)存储在叶子中,并且......“bar”是只是一个字符串。我想知道我是否可以使用与“制造商”类似的东西:用“可调用”(某种)东西存储它:带有比较器的属性:!=
我尝试使用“eval”并且它可能有效,但比较实际上将用于查询MySQL数据库(使用sqlalchemy),我有点担心它的安全性......
任何想法都将深受赞赏。谢谢!
PS: 所有这一切的想法是能够生成sqlalchemy查询,所以如果用户输入字符串: Product.manufacturer!=“foo”|| Product.manufacturer!=“bar”
...我的树状物可以生成以下内容: sqlalchemy.or_(Product.manufacturer!=“foo”,Product.manufacturer!=“bar”)
由于sqlalchemy.or_是可调用的,我也可以将它存储在其中一个叶子中...我只看到“!=”的问题
答案 0 :(得分:2)
我没有太多使用SQLAlchemy,但我猜它会使用Python's operator overloading来处理这些比较。如果这是真的,那么你可以使用属性的魔术方法。例如:
Product.manufacturer == 'bar' => Product.manufacturer.__eq__('bar')
Product.manufacturer != 'foo' => Product.manufacturer.__ne__('foo')
您应该能够在属性对象上执行getattr
以获得适当的魔术方法:
method_map = {'==': '__eq__', '!=': '__ne__'}
comparison = getattr(Product.manufacturer, method_map[op]) # Here, 'op' is the operator (!=)
sqlalchemy.or_(comparison('foo'), comparison('bar')) # Equivalent to: Product.manufacturer != 'foo' || Product.manufacturer != 'bar'
希望这会有所帮助:)