Python 通过“无”或“无”进行过滤的优雅方式

Python 通过“无”或“无”进行过滤的优雅方式,python,sqlalchemy,Python,Sqlalchemy,以下SQLAlchemy代码可以工作,但看起来不像Python: if has_died: # has_died: True or False query = query.filter(User.died_at != None) else: query = query.filter(User.died_at == None) 添加过滤器的更优雅的方法是什么?您可以用 你可以这样做: query = query.filter((User.died_at != None) if has_d

以下SQLAlchemy代码可以工作,但看起来不像Python:

if has_died: # has_died: True or False
  query = query.filter(User.died_at != None)
else:
  query = query.filter(User.died_at == None)

添加过滤器的更优雅的方法是什么?

您可以用


你可以这样做:

query = query.filter((User.died_at != None) if has_died else (User.died_at == None))
但是它有点难读。我想你现在做得很好。

那你呢:

query=query.filter(bool(User.died\u at)=has\u died)

它返回:

  • False
    if
    User.died\u at
    None
    已死亡
    True
  • True
    if
    User.died\u at
    None
    已死亡
    False
  • True
    if
    User.died\u at
    不是
    None
    并且
    已经死了
    True
  • False
    if
    User.died\u at
    不是
    None
    并且
    已经死了
    False
这是预期的行为


但话说回来,我不确定它是否比你的代码更容易理解

布尔型。是真是假我认为我不得不重写整行内容,只是为了从!=to==…没有使用三元运算符那么难看。我不知道SQLAlchemy,但我假设有某种魔力在那里,它会返回除
True
False
以外的其他值进行比较。是的,它是。这我认为不可能做得更好。
User.dead\u at!=None
User.dead_at==None
不返回
bool
;它们返回一个SQLAlchemy对象。正如问题注释中的链接:哦,我不熟悉SQLAlchemy语法。严格地说,在python中,
None
被认为是
False
。有没有办法让这个电话有效?因为我认为这是最优雅的方式。否则很抱歉我的错误贡献。没问题。即使它的表现更接近您的预期,而
bool(None)=False
None!=False
,所以它们不是同一件事。您可以有一个值,该值可以是
True
False
None
,每个值都有自己的含义。例如,如果它是对是/否问题的回答,它们可能意味着
,以及
未回答
。事实上,我的评论可能有误导性,认为
错误的是
bool(None)
。确实,
None
False
true
都有不同的含义。@Tobo,我同意,这就是为什么我认为你应该坚持你所拥有的:)。
query = query.filter((User.died_at != None) if has_died else (User.died_at == None))