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)
在您的情况下,您想使用重载==运算符,因此警告不正确.
有三种方法可以消除警告:
您可以为该单行禁用该特定警告:
对于Flake8/PyFlakes:
session.query(MyModel).filter(MyModel.my_column != None).all() # noqa: E711
Run Code Online (Sandbox Code Playgroud)对于Pylint:
session.query(MyModel).filter(MyModel.my_column != None).all() # pylint: disable=singleton-comparison
Run Code Online (Sandbox Code Playgroud)您可以通过直接调用类的__eq__for(for ==)和__ne__(for !=)方法来避免使用相等运算符:
session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
Run Code Online (Sandbox Code Playgroud)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并知道表达式右侧的类型.