Выражение IS NOT NULL без возникновения ошибки PEP8

В какой-то момент моего проекта мне нужно запросить объект SQLAlchemy для столбцов, которые не являются NULL. В моем коде я:

session.query(MyModel).filter(MyModel.my_column != None).all()

... и он отлично работает. Проблема в том, что всякий раз, когда я запускаю pep8 или один из других линтов в файле, возникает ошибка E711: сравнение с None должно быть if cond is not None:. Я согласен с духом этого руководства, и поэтому я не хочу замолчать предупреждение только из-за одной маленькой строки.

Есть ли другой способ написать это? Предпочтительно, где нам не нужно копаться в модуле func?

Ответы

Ответ 1

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()
    
  • Вы можете использовать .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, вероятно, лучше, если вы действительно не любите использовать методы __ и знаете тип правой части вашего выражения.