在我的项目中的某个点,我需要查询SQLAlchemy对象的NOT NULL列。在我的代码中,我做:
session.query(MyModel).filter(MyModel.my_column != None).all()
......而且效果很好。问题是,每当我在文件上运行pep8
或其他一个短语时,它都会引发错误E711:与None
的比较应该是if cond is not None:
。我同意这条准则的精神,因此我不想因为一条小线而使警告无声。
有没有其他方式来写这个?最好是我们不必深入挖掘func
模块?
PEP8并不打算遵循这封信。
你建议使用is None
而不是== None
,因为is
不能超载(不像==
):
>>> class Bad(object):
... def __eq__(self, other):
... return True
...
>>> instance = Bad()
>>> instance == None
True
>>> instance is None
False
在您的情况下,您想使用重载的==
运算符,因此警告不正确。
有三种方法可以消除警告:
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
__eq__
(对于==
)和__ne__
(对于!=
)方法来避免使用等于运算符:
session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
.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可能更好,除非你真的不喜欢使用__
方法并知道表达式右侧的类型。