在变量中存储比较(或者在以字符串形式给出时执行比较)

时间:2011-01-16 01:35:40

标签: python sqlalchemy call

我想知道超级强大的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_是可调用的,我也可以将它存储在其中一个叶子中...我只看到“!=”的问题

1 个答案:

答案 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'

希望这会有所帮助:)