Flake8 жалуется на логическое сравнение "==" в предложении фильтра
У меня есть логическое поле в таблице mysql db.
# table model
class TestCase(Base):
__tablename__ = 'test_cases'
...
obsoleted = Column('obsoleted', Boolean)
Чтобы получить счет всех неисследованных тестовых примеров, это можно сделать так:
caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
print(caseNum)
Это хорошо работает, но в flake8 сообщается следующее предупреждение:
E712: Сравнение с False должно быть "if cond is False:" или "if not конд:"
Хорошо, я думаю, что это имеет смысл. Так измените мой код на это:
caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()
или
caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()
Но ни один из них не может работать. Результат всегда равен 0.
Я думаю, что предложение фильтра не поддерживает оператор "есть" или "нет". Кто-нибудь скажет мне, как справиться с этой ситуацией. Я не хочу отключать чешуйку.
Ответы
Ответ 1
Это потому, что фильтры SQLAlchemy являются одним из немногих мест, где == False
имеет смысл. В другом месте вы не должны использовать его.
Добавьте комментарий # noqa
к строке и сделайте с ней.
Или вы можете использовать sqlalchemy.sql.expression.false
:
from sqlalchemy.sql.expression import false
TestCase.obsoleted == false()
где false()
возвращает правильное значение для диалекта SQL вашего сеанса. Существует сопоставление sqlalchemy.expression.true
.
Ответ 2
SQL Алхимия также имеет функции is_
и isnot
, которые вы можете использовать. Пример:
Model.filter(Model.deleted.is_(False))
Подробнее об этом здесь
Ответ 3
@Jruv Используйте # noqa
перед оператором, он будет игнорировать предупреждение.