flake8 se plaint booléen comparaison “==” dans le filtre de la clause
J'ai un champ booléen dans la db mysql table.
# table model
class TestCase(Base):
__tablename__ = 'test_cases'
...
obsoleted = Column('obsoleted', Boolean)
Pour obtenir le nombre de tous les non-obsolète cas de test, qui peut être fait simplement comme ceci:
caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
print(caseNum)
Qui fonctionne très bien, mais la flake8 rapport de l'avertissement suivant:
E712: Comparaison de Faux doit être "si cond est Fausse:" ou la "si ce n'
cond:"
D'accord, je pense que faire du sens. Afin de modifier mon code pour ce:
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 peut travailler. Le résultat est toujours 0.
Je pense que la clause de filtre ne prend pas en charge l'opérateur "est" ou "n'est pas". Quelqu'un peut me dire comment gérer cette situation. Je ne veux pas désactiver le flocon.
- PEP 8 conseille spécifiquement contre "si cond est Faux". Je suis surpris que le pep8 outil fait le contraire.
Vous devez vous connecter pour publier un commentaire.
C'est parce que SQLAlchemy filtres sont l'un des rares endroits où
== False
fait réellement sens. Partout ailleurs vous devriez pas l'utiliser.Ajouter un
# noqa
commentaire à la ligne et être fait avec elle.Ou vous pouvez utiliser
sqlalchemy.sql.de l'expression.false
:où
false()
retourne la bonne valeur pour votre session dialecte SQL. Il y a une correspondancesqlalchemy.de l'expression.true
.SQL Alchimie a également
is_
etisnot
fonctions que vous pouvez utiliser. Un exemple seraitPlus sur ceux qui sont ici
is
et==
sont différents, mais je suis sûr que le code SQL généré sera le même.is
et==
sont différents dans SQLAlchemy parce que vous ne pouvez pas remplacer l'identité opérateur (is
) en python. Une expression commeModel.column is False
est toujours évalué commeFalse
parce que la comparaison est toujours le cas immédiatement en python et la base de données. Le résultat de la comparaison de l'identité d'un objet de colonne et un booléen est toujoursFalse
. Cela insère des déclarations commeWHERE FALSE
ouAND FALSE
dans votre requête, dans la plupart des cas la cause de retourner la valeur 0, les lignes n'importe quoi.@Jruv Utilisation
# noqa
en face de déclaration, il va ignorer l'avertissement.# noqa
va désactiver flake8 / pep / autres-linters de la ensemble la chaîne, de sorte que les autres peluchage-avertissements seront ignorés trop. D'autres réponses offrir de meilleures solutions, par exemple,.is_
-méthode.J'ai un oeil ce que exacte de la requête est générée à l'aide de
SQLAlchemy
quand==
etis_
lorsque le base de données dialecte estPostgresql
pour champ booléen:pour
==
nous obtenons:field == False
est converti àfield = false
field == True
est converti àfield = true
field == None
est converti àfield IS NULL
pour
is_()
nous obtenons:field.is_(False)
est converti àfield IS false
field.is_(True)
est converti àfield IS true
field.is_(None)
est converti àfield IS NULL
REMARQUE:
is_(not None)
seront évalués àis_(bool(not None)
ce qui donneis_(True)
donnantfield = true
de sorte que vous allez plutôt pourisnot(None)
la production defield IS NOT NULL