Python 通过“无”或“无”进行过滤的优雅方式
以下SQLAlchemy代码可以工作,但看起来不像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
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)
它返回:
ifFalse
为User.died\u at
且None
为已死亡
True
ifTrue
为User.died\u at
且None
为已死亡
False
ifTrue
不是User.died\u at
并且None
是已经死了
True
ifFalse
不是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))