在我的项目中的某个点,我需要查询SQLAlchemy对象的NOT NULL列。在我的代码中,我这样做:
session.query(MyModel).filter(MyModel.my_column != None).all()
......而且效果很好。问题是,每当我在文件上运行pep8
或其他一个短语时,都会引发错误E711:与None
的比较应为if cond is not None:
。我同意这条准则的精神,因此我不想仅仅因为一条小线而使警告沉默。
还有其他方法可以写这个吗?最好是我们不必深入研究func
模块?
答案 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
在您的情况下,希望使用重载的==
运算符,因此警告不正确。
有三种方法可以消除警告:
您可以为该单行禁用该特定警告:
对于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
您可以通过直接调用类__eq__
(适用于==
)和__ne__
(适用于!=
)方法来避免使用相等运算符:
session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
session.query(MyModel).filter(MyModel.my_column.isnot(None)).all()
请注意,.is_
和.isnot
与==
和!=
不同。 MyModel.my_column != x
可能意味着IS NOT NULL
和!= x
,具体取决于x
和您的数据库的价值,因此解决方案1和2可能更好,除非您真的不喜欢使用__
- 方法并了解表达式右侧的类型。