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

时间:2014-06-01 23:23:48

标签: python sqlalchemy pep8

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

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

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

还有其他方法可以写这个吗?最好是我们不必深入研究func模块?

1 个答案:

答案 0 :(得分: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_.isnot

    session.query(MyModel).filter(MyModel.my_column.isnot(None)).all()
    

    请注意,.is_.isnot==!=不同。 MyModel.my_column != x可能意味着IS NOT NULL!= x,具体取决于x和您的数据库的价值,因此解决方案1和2可能更好,除非您真的不喜欢使用__ - 方法并了解表达式右侧的类型。