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: E222Para 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.isnotno son lo mismo que==y!=.MyModel.my_column != xpuede significar tantoIS NOT NULLcomo!= xsegún el valor dexsu 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.