在Python中,如何从函数内获取作为参数传递的表达式?

问题描述 投票:0回答:1

我正在尝试重现 sqlalchemy 和 peewee 等 ORM 的行为,这些 ORM 允许将整个表达式作为单个参数传递给函数。例如,在 sqlalchemy 或 peewee 中,我更喜欢用作参考,因为源代码更容易理解,我们可以执行以下操作:

grandma = Person.select().where(Person.name == 'Grandma L.').get()

我想要理解和重现的是如何处理作为参数提供给

where()
Person.name == 'Grandma L.'
部分)的表达式,以从函数内获取它,以便稍后我可以将其转换为SQL语句。

我知道我可以将表达式放在引号中以将其作为一个字符串参数传递,但这不是很Pythonic,而且 peewee 和 sqlalchemy 都不需要这样做。我试图通过检查源代码来了解他们是如何做到这一点的,以及我认为用于选择查询的 where() 函数,但这个函数中几乎没有任何内容,我无法弄清楚他们如何处理表达式有争论。它们似乎只是将

*expression
作为参数,就像
*args
一样接受未知数量的参数。我还检查了 sqlalchemy 的 where() 函数,他们也以某种方式使用
*whereclause
形式来接收表达式。

我更不知道如何用这样复杂的表达来做到这一点:

query = Person.select().where((Person.birthday < d1940) | (Person.birthday > d1960)))

根据我经过大量测试后的理解,python将始终评估作为参数传递的表达式,并将表达式的结果传递给函数,那么是否有可能从函数内部获取表达式本身?

python sqlalchemy expression peewee
1个回答
0
投票

您不需要传递表达式本身 - 评估结果表达式是一个对象,它向 SQLAlchemy 描述您要应用的过滤器是什么。

因此:

conditions = [(Person.birthday < d1940) | (Person.birthday > d1960)]

...可以随意传递结果,然后用作:

query = Person.select().where(*conditions)
© www.soinside.com 2019 - 2024. All rights reserved.