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

smi*_*lli 18 python sqlalchemy pep8

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

session.query(MyModel).filter(MyModel.my_column != None).all()
Run Code Online (Sandbox Code Playgroud)

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

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

Ble*_*der 24

PEP8并不打算遵循这封信.

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

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

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

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

  1. 您可以为该单行禁用该特定警告:

  2. 您可以通过直接调用类的__eq__for(for ==)和__ne__(for !=)方法来避免使用相等运算符:

    session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你可以使用.is_.isnot:

    session.query(MyModel).filter(MyModel.my_column.isnot(None)).all()
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,.is_并且.isnot==and不同!=.MyModel.my_column != x可以表示两者IS NOT NULL并且!= x取决于x数据库和数据库的值,因此解决方案1和2可能更好,除非您真的不喜欢使用__-methods并知道表达式右侧的类型.

  • 那个'#noqa`标记很方便!我很高兴我现在知道了. (2认同)