【发布时间】:2020-04-07 20:20:45
【问题描述】:
我可以在 Python 中在方法级别实现内联 if 吗?
让我们来看看这个(简化的)情况:
# DB-level 'or'
db.session.query(TableClass).filter(or_(TableClass.column_1 == value_1,
TableClass.column_2 == value_2)).first()
# basic Python-level 'if'
if value_1:
db.session.query...value_1
if value_2:
db.session.query...value_2
不是像上面那样查询数据库或添加额外的if 语句,是否可以通过以下方式实现相同的内联:
# desired inline Python 'if' at method level
db.session.query(TableClass).filter({
if value_1 TableClass.column_1 == value_1 \
else if value_2 TableClass.column_2 == value_2 else None
}).first()
# ^-- or something similar at method level
或者,仅当基础值存在时才激活 SQLAlchemy 过滤器的一部分。
这里的主要动机是 DRY 并避免数据库搜索 None 值。
尝试将starred expression 与if 语句的内联组合为suggested:
session.query(Foo).filter((*[Foo.attr1==attr1, Foo.attr2==attr2] if attr2 else *[Foo.attr1==attr1]))
但我在if 得到SyntaxError: invalid syntax。
更新
现在我使用this style 将条件定义为可以附加在一起的单独变量:
query = session.query(Table)
conditions = []
if abc:
conditions.append(Table.field1 == foo)
if def:
conditions.append(Table.field2 == bar)
query = query.filter(or_(*conditions))
虽然我很欣赏 Pierre V 在下面为加星表达式和 or_(TableClass.column_1 == value_1, true() if value_1 is None else false()) 建议修复语法的回答。
【问题讨论】:
标签: python if-statement methods sqlalchemy inline