python - query - Expresar IS NOT NULL sin causar un error PEP8
sqlalchemy select (1)
En cierto punto de mi proyecto, necesito consultar un objeto SQLAlchemy para columnas que NO SON NULAS. En mi código, hago:
session.query(MyModel).filter(MyModel.my_column != None).all()
... y funciona genial El problema es que cada vez que ejecuto pep8
o uno de los otros linters en el archivo, aparece un error E711: la comparación con None
debe ser if cond is not None:
Estoy de acuerdo con el espíritu de esta guía, y como tal, no quiero silenciar la advertencia solo por una pequeña línea.
¿Hay alguna otra forma de escribir esto? ¿Preferiblemente uno donde no tenemos que profundizar en el módulo func
?
PEP8 no debe seguirse al pie de la letra.
Se recomienda utilizar is None
lugar de == None
porque no se puede sobrecargar (a diferencia de ==
):
>>> class Bad(object):
... def __eq__(self, other):
... return True
...
>>> instance = Bad()
>>> instance == None
True
>>> instance is None
False
En su caso, desea utilizar el operador sobrecargado ==
, por lo que la advertencia es incorrecta.
Hay tres formas de hacer que la advertencia desaparezca:
Puede deshabilitar esa advertencia particular para esa línea única:
Para Flake8 / PyFlakes:
session.query(MyModel).filter(MyModel.my_column != None).all() # noqa: E222
Para Pylint:
session.query(MyModel).filter(MyModel.my_column != None).all() # pylint: disable=singleton-comparison
Puede evitar el uso del operador de igualdad llamando directamente a los
__eq__
(para==
) y__ne__
(for!=
) De la clase:session.query(MyModel).filter(MyModel.my_column.__ne__(None)).all()
session.query(MyModel).filter(MyModel.my_column.isnot(None)).all()
Tenga en cuenta que
.is_
y.isnot
no son lo mismo que==
y!=
.MyModel.my_column != x
puede significar tantoIS NOT NULL
como!= x
según el valor dex
su base de datos, por lo que las soluciones 1 y 2 son probablemente mejores a menos que realmente no le guste usar__
-methods y sepa el tipo de el lado derecho de tu expresión.