表示IS NOT NULL而不会导致PEP8错误

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

在我的项目中的某个点,我需要查询SQLAlchemy对象的NOT NULL列。在我的代码中,我做:

session.query(MyModel).filter(MyModel.my_column != None).all()

......而且效果很好。问题是,每当我在文件上运行pep8或其他一个短语时,它都会引发错误E711:与None的比较应该是if cond is not None:。我同意这条准则的精神,因此我不想因为一条小线而使警告无声。

有没有其他方式来写这个?最好是我们不必深入挖掘func模块?

python sqlalchemy pep8
1个回答
22
投票

PEP8并不打算遵循这封信。

你建议使用is None而不是== None,因为is不能超载(不像==):

>>> class Bad(object):
...     def __eq__(self, other):
...         return True
...
>>> instance = Bad()
>>> instance == None
True
>>> instance is None
False

在您的情况下,您想使用重载的==运算符,因此警告不正确。

有三种方法可以消除警告:

  1. 您可以为该单行禁用该特定警告: 对于Flake8 / PyFlakes: session.query(MyModel).filter(MyModel.my_column != None).all() # noqa: E711 对于Pylint: session.query(MyModel).filter(MyModel.my_column != None).all() # pylint: disable=singleton-comparison
  2. 您可以通过直接调用类的__eq__(对于==)和__ne__(对于!=)方法来避免使用等于运算符: session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
  3. 你可以使用.is_.isnotsession.query(MyModel).filter(MyModel.my_column.isnot(None)).all() 请注意,.is_.isnot==!=不同。 MyModel.my_column != x可能意味着IS NOT NULL!= x取决于x和你的数据库的价值,所以解决方案1和2可能更好,除非你真的不喜欢使用__方法并知道表达式右侧的类型。
© www.soinside.com 2019 - 2024. All rights reserved.