python affirmer avec et sans parenthèse
Voici quatre simples invocations d'affirmer:
>>> assert 1==2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert 1==2, "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: hi
>>> assert(1==2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert(1==2, "hi")
Noter que le dernier ne génère pas d'erreur. Quelle est la différence entre un appel affirmer avec ou sans parenthèses qui provoque ce comportement? Ma pratique est d'utiliser les parenthèses, mais la ci-dessus montre que je ne devrais pas.
- Merci pour les réponses utiles. La distinction entre les mots clés et les fonctions intégrées semble subtile. Voici une liste des mots clés, pour qui, je présume, les parenthèses ne doit être laissé de côté: docs.python.org/reference/lexical_analysis.html#keywords
- Une différence est que vous pouvez redéfinir les fonctions intégrées, mais ne peut pas le faire avec des mots-clés (non pas que l'ancien est une bonne idée).
- Ce n'est pas la fonction vs mot-clé distinction, mais l'appel de la fonction vs déclaration. (par exemple - print, utilisé pour être une déclaration, et a travaillé sans les parenthèses).
Vous devez vous connecter pour publier un commentaire.
La dernière
assert
aurait donné un avertissement (SyntaxWarning: assertion is always true, perhaps remove parentheses?
) si vous avez exécuté grâce à un interprète, et non pas par le biais d'INACTIVITÉ. Parce queassert
est un mot-clé et non pas une fonction, vous êtes réellement en passant dans un tuple comme premier argument et laissant le deuxième argument.Rappeler que la non-vide de n-uplets d'évaluer à
True
, et depuis l'affirmation message est facultatif, vous avez essentiellement appeléassert True
quand vous avez écritassert(1==2, "hi")
.assert (1==2)
est parenthèses autour de l'expression unique de ne pas créer un tuple automatiquement; vous obtiendrez le même comportement que #4 si vous n'avezassert (1==2,)
. La même chose pourrait se produire si vous n'avezprint ('foo', 'bar')
au lieu deprint 'foo', 'bar'
; vous verriez le n-uplet de sortieassert(test, message)
probablement faux, et certainement de la confusion. Pas de parens!Si vous mettez la parenthèse là parce que tu voulais un multi-ligne affirmer, l'alternative est de mettre un antislash à la fin de la ligne comme ceci:
Imprime:
Pourquoi est-ce que python
assert
être différent de tout le reste:Je pense que le pythonic l'idéologie, c'est qu'un programme doit s'auto-corriger sans avoir à se soucier du drapeau spécial pour activer l'affirme. La tentation de désactiver affirme est trop grande, et il est donc déconseillé.
Je partage votre agacement que le python
assert
a une syntaxe unique par rapport à tous les autres de programmation python les constructions, et cette syntaxe a encore une fois changé de python2 pour python3 et de nouveau changé de python 3.4 à 3.6.Faire valoir des instructions de ne pas rétro-compatible à partir d'une version à une autre version.
C'est une tape sur l'épaule qui
assert
est une 3ème classe citoyen, il sera totalement supprimé en python4, et certainement à nouveau en Python 8.1.assert 1==2, "hi"
est analysée commeassert 1==2, "hi"
avec "salut" comme second paramètre pour le mot-clé. Donc pourquoi il correctement donne une erreur.assert(1==2)
est analysée commeassert (1==2)
qui est identique àassert 1==2
, parce que les parenthèses autour d'un seul point de ne pas créer un tuple moins qu'il y a une virgule par exemple(1==2,)
.assert(1==2, "hi")
est analysée commeassert (1==2, "hi")
, qui ne donnent pas une erreur, car un non-vide de n-uplet(False, "hi")
n'est pas une valeur fausse, et il n'y a pas de second paramètre fourni à la clé.Vous ne devriez pas utiliser des parenthèses parce que
assert
n'est pas une fonction en Python - c'est un mot-clé.Vous pouvez rompre instruction assert sans
\
comme ceci:Ou si vous avez même plus de message:
Suivant est cité à partir de la python doc
La forme simple, l'affirmer, l'expression est équivalente à
if __debug__:
if not expression: raise AssertionError
La forme élargie, affirmer expression1, expression2, est équivalent à
if __debug__:
if not expression1: raise AssertionError(expression2)
Ainsi, lorsque vous êtes à l'aide de parenthèses ici, vous êtes à l'aide de la forme simple, et l'expression est évaluée comme un tuple, ce qui est toujours Vrai quand être coulé bool