113 votes

Flake8 se plaint de la comparaison booléenne "==" dans la clause de filtrage

J'ai un champ booléen dans la table de base de données mysql.

# modèle de table
class TestCase(Base):
    __tablename__ = 'test_cases'
    ...
    obsoleted = Column('obsoleted',  Boolean)

Pour obtenir le nombre de tous les cas de test non obsolètes, vous pouvez simplement le faire comme ceci:

caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
print(caseNum)

Cela fonctionne bien, mais le rapport flake8 indique l'avertissement suivant:

E712: La comparaison à False devrait être "if cond is False:" ou "if not cond:"

D'accord, je pense que cela a du sens. Alors changez mon code à ceci:

caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()

ou

caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()

Mais aucun des deux ne fonctionne. Le résultat est toujours 0. Je pense que la clause de filtrage ne prend pas en charge l'opérateur "is" ou "is not". Quelqu'un peut-il me dire comment gérer cette situation. Je ne veux pas désactiver le flake.

143voto

Martijn Pieters Points 271458

C'est parce que les filtres SQLAlchemy sont l'un des rares endroits où == False a en fait du sens. Partout ailleurs, vous ne devriez pas l'utiliser.

Ajoutez un commentaire # noqa à la ligne et c'est tout.

Ou vous pouvez utiliser sqlalchemy.sql.expression.false:

from sqlalchemy.sql.expression import false

TestCase.obsoleted == false()

false() renvoie la bonne valeur pour le dialecte SQL de votre session. Il y a également un sqlalchemy.expression.true correspondant.

114voto

avoliva Points 105

SQL Alchemy possède également des fonctions is_ et isnot que vous pouvez utiliser. Un exemple serait

Model.filter(Model.deleted.is_(False))

Plus d'informations ici

24voto

andi Points 1035

J'ai jeté un œil à la requête exacte générée pour utiliser SQLAlchemy lorsque == et is_ lorsque le dialecte de la base de données est Postgresql pour un champ booléen:

  • pour == nous obtenons:

    1. field == False est converti en field = false
    2. field == True est converti en field = true
    3. field == None est converti en field IS NULL
  • pour is_() nous obtenons:

    1. field.is_(False) est converti en field IS false
    2. field.is_(True) est converti en field IS true
    3. field.is_(None) est converti en field IS NULL

REMARQUE: is_(not None) sera évalué en is_(bool(not None) ce qui donne is_(True) donnant field = true donc vous devriez plutôt utiliser isnot(None) ce qui produit field IS NOT NULL

3voto

Dominik Janků Points 31

Pourquoi n'utilisez-vous pas .filter_by(champ=True) / .filter_by(champ=False) ?

1voto

user3016020 Points 452

@Jruv Utilisez # noqa devant l'instruction, cela ignorera l'avertissement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X