J'ai lu du code source et à plusieurs endroits, j'ai vu l'utilisation de assert
.
Qu'est-ce que cela signifie exactement? Quelle est son utilisation?
python
assert
assertions
Hossein
la source
la source
Réponses:
L'
assert
instruction existe dans presque tous les langages de programmation. Il permet de détecter les problèmes au début de votre programme, où la cause est claire, plutôt que plus tard comme effet secondaire d'une autre opération.Quand vous le faites ...
... vous dites au programme de tester cette condition et de déclencher immédiatement une erreur si la condition est fausse.
En Python, c'est à peu près équivalent à ceci:
Essayez-le dans le shell Python:
Les assertions peuvent inclure un message facultatif et vous pouvez les désactiver lors de l'exécution de l'interpréteur.
Pour imprimer un message si l'assertion échoue:
N'utilisez pas de parenthèses pour appeler
assert
comme une fonction. C'est une déclaration. Si vous le faites,assert(condition, message)
vous exécuterez leassert
avec un(condition, message)
tuple comme premier paramètre.Quant à les désactiver, lors de l'exécution
python
en mode optimisé, où__debug__
estFalse
, les instructions assert seront ignorées. Passez juste le-O
drapeau:Voir ici pour la documentation pertinente.
la source
if not condition: raise AssertError()
, pourquoi devrais-je utiliser assert? Existe-t-il des conditions dans lesquelles l'affirmation est meilleure autre que le simple fait d'être une forme deif not condition
déclaration plus courte ?if
). Lisez la documentation pour plus d'informations :)assert
, mais après avoir lu toutes les réponses, je n'ai absolument rien que je veux!Attention aux parenthèses. Comme cela a été souligné ci-dessus, en Python 3,
assert
est toujours une déclaration , donc par analogie avecprint(..)
, on peut extrapoler la même chose àassert(..)
ouraise(..)
mais vous ne devriez pas.Ceci est important car:
ne fonctionnera pas, contrairement à
La raison pour laquelle le premier ne fonctionnera pas est qu'il
bool( (False, "Houston we've got a problem") )
évalueTrue
.Dans l'instruction
assert(False)
, ce ne sont que des parenthèses redondantesFalse
, qui évaluent leur contenu. Mais avecassert(False,)
les parenthèses sont maintenant un tuple, et un tuple non vide est évaluéTrue
dans un contexte booléen.la source
assert (2 + 2 = 5), "Houston we've got a problem"
ça devrait aller, oui?assert (2 + 2 = 5), "Houston we've got a problem"
ne fonctionnera pas ... mais cela n'a rien à voir avec la déclaration assert, ce qui est bien. Votre condition ne fonctionnera pas car ce n'est pas une condition. Manquant une seconde=
.Comme d'autres réponses l'ont noté, cela
assert
revient à lancer une exception si une condition donnée n'est pas vraie. Une différence importante est que les instructions assert sont ignorées si vous compilez votre code avec l'option d'optimisation-O
. La documentation dit que celaassert expression
peut mieux être décrit comme étant équivalent àCela peut être utile si vous souhaitez tester soigneusement votre code, puis publier une version optimisée lorsque vous êtes satisfait qu'aucun de vos cas d'assertion échoue - lorsque l'optimisation est activée, la
__debug__
variable devient False et les conditions cessent d'être évaluées. Cette fonctionnalité peut également vous rattraper si vous comptez sur les assertions et ne réalisez pas qu'elles ont disparu.la source
if Not Error: raise Exception(“ this is a error”)
? De cette façon, le programme affichera toujours la source de l'erreur, lorsque l'utilisateur l'exécutera.assert
instruction? L'hypothèse ici est que lorsque le programme est remis à l'utilisateur final, vous utilisez l'indicateur -O, supposant ainsi que tous les bogues ont été supprimés. Par conséquent, toute erreur ou panne de programme est due à une entrée dans le programme qui est valide selon le contrat, mais ne peut pas être gérée par le programme. Il devrait donc alerter l'utilisateur en tant que tel.Le but d'une assertion en Python est d'informer les développeurs sur les erreurs irrécupérables dans un programme.
Les assertions ne sont pas destinées à signaler des conditions d'erreur attendues, comme «fichier introuvable», où un utilisateur peut prendre des mesures correctives (ou simplement réessayer).
Une autre façon de voir les choses est de dire que les assertions sont des auto-contrôles internes dans votre code. Ils fonctionnent en déclarant certaines conditions impossibles dans votre code. Si ces conditions ne tiennent pas, cela signifie qu'il y a un bogue dans le programme.
Si votre programme est exempt de bogues, ces conditions ne se produiront jamais. Mais si l' un d'eux ne fait que se produit le programme plantera avec une erreur d'assertion vous dire exactement quelle condition « impossible » a été déclenchée. Cela facilite grandement la recherche et la correction des bogues dans vos programmes.
Voici un résumé d' un tutoriel sur les assertions de Python que j'ai écrites:
la source
assert
déclaration et quand l'utiliser. J'essaie de comprendre un certain nombre de termes que vous avez introduits dans l'article.assert store.product_exists(product_id), 'Unknown product id'
n'est pas une bonne pratique, car si le débogage est désactivé, leuser
même sinon unadmin
pourra supprimer le produit. Considérez-vousassert user.is_admin()
comme uneunrecoverable
erreur? Pourquoi est-ce pas unself-check
?assert statement
, ne peut-price
il pas également être considéré comme une entrée utilisateur? Pourquoi considérez-vousassert user.is_admin()
que la validation des données mais pasassert price
?D'autres vous ont déjà donné des liens vers la documentation.
Vous pouvez essayer ce qui suit dans un shell interactif:
La première déclaration ne fait rien, tandis que la seconde soulève une exception. C'est le premier indice: les assertions sont utiles pour vérifier les conditions qui devraient être vraies à une position donnée de votre code (généralement, le début (conditions préalables) et la fin d'une fonction (postconditions)).
Les assertions sont en fait fortement liées à la programmation par contrat, ce qui est une pratique d'ingénierie très utile:
http://en.wikipedia.org/wiki/Design_by_contract .
la source
Depuis les documents:
Ici, vous pouvez en savoir plus: http://docs.python.org/release/2.5.2/ref/assert.html
la source
L'instruction assert a deux formes.
La forme simple,,
assert <expression>
équivaut àLa forme étendue,,
assert <expression1>, <expression2>
équivaut àla source
Les assertions sont un moyen systématique de vérifier que l'état interne d'un programme est celui attendu par le programmeur, dans le but de détecter les bogues. Voir l'exemple ci-dessous.
la source
Voici un exemple simple, enregistrez-le dans un fichier (disons b.py)
et le résultat quand
$python b.py
la source
si l'instruction après assertion est vraie, le programme continue, mais si l'instruction après assertion est fausse, le programme donne une erreur. Aussi simple que cela.
par exemple:
la source
L'
assert
instruction existe dans presque tous les langages de programmation. Il permet de détecter les problèmes au début de votre programme, où la cause est claire, plutôt que plus tard comme effet secondaire d'une autre opération. Ils attendent toujours uneTrue
condition.Lorsque vous faites quelque chose comme:
Vous dites au programme de tester cette condition et de déclencher immédiatement une erreur si elle est fausse.
En Python, l'
assert
expression est équivalente à:Vous pouvez utiliser l'expression étendue pour transmettre un message facultatif :
Essayez-le dans l'interpréteur Python:
Il y a quelques mises en garde à voir avant de les utiliser principalement pour ceux qui jugent basculer entre les déclarations
assert
etif
. Le but d'utiliserassert
est parfois lorsque le programme vérifie une condition et renvoie une valeur qui devrait arrêter le programme immédiatement au lieu de prendre une autre manière de contourner l'erreur:1. Parenthèses
Comme vous l'avez peut-être remarqué, l'
assert
instruction utilise deux conditions. Par conséquent, n'utilisez pas de parenthèses pour les englober comme un conseil évident. Si vous faites comme:Exemple:
Vous exécuterez le
assert
avec un(condition, message)
qui représente un tuple comme premier paramètre, et cela se produit car le tuple non vide en Python l'est toujoursTrue
. Cependant, vous pouvez le faire séparément sans problème:Exemple:
2. Objectif du débogage
Si vous vous demandez quand utiliser la
assert
déclaration. Prenons un exemple utilisé dans la vie réelle:* Lorsque votre programme a tendance à contrôler chaque paramètre entré par l'utilisateur ou autre:
* Un autre cas concerne les mathématiques lorsque 0 ou non positif comme coefficient ou constante sur une certaine équation:
* ou même un simple exemple d'implémentation booléenne:
3. Traitement ou validation des données
La plus grande importance est de ne pas compter sur l'
assert
instruction pour exécuter le traitement ou la validation des données car cette instruction peut être désactivée lors de l'initialisation Python avec-O
ou-OO
indicateur - ce qui signifie la valeur 1, 2 et 0 (par défaut), respectivement - ouPYTHONOPTIMIZE
la variable d'environnement .Valeur 1:
* les assertions sont désactivées;
* les fichiers de bytecode sont générés en utilisant l'
.pyo
extension au lieu de.pyc
;*
sys.flags.optimize
est défini sur 1 (True
);* et,
__debug__
est défini surFalse
;Valeur 2: désactive une autre chose
* les docstrings sont désactivées;
Par conséquent, l'utilisation de l'
assert
instruction pour valider une sorte de données attendues est extrêmement dangereuse, impliquant même certains problèmes de sécurité. Ensuite, si vous devez valider une autorisation, je vous recommanderaise AuthError
plutôt. En tant qu'effet préalable, anassert
est couramment utilisé par les programmeurs sur des bibliothèques ou des modules qui n'ont pas d'interaction directe avec un utilisateur.la source
Comme résumé brièvement sur le C2 Wiki :
Vous pouvez utiliser une
assert
instruction pour documenter votre compréhension du code à un point de programme particulier. Par exemple, vous pouvez documenter des hypothèses ou des garanties sur les entrées (préconditions), l'état du programme (invariants) ou les sorties (postconditions).Si votre affirmation échoue, il s'agit d'une alerte pour vous (ou votre successeur) que votre compréhension du programme était erronée lorsque vous l'avez écrit et qu'il contient probablement un bogue.
Pour plus d'informations, John Regehr a un merveilleux article de blog sur l' utilisation des assertions , qui s'applique également à la
assert
déclaration Python .la source
Si vous voulez savoir exactement ce que fait une fonction réservée en python, tapez
help(enter_keyword)
Assurez-vous que si vous saisissez un mot-clé réservé, saisissez-le sous forme de chaîne.
la source
Python assert est fondamentalement une aide au débogage qui teste la condition pour l'auto-vérification interne de votre code. Assert facilite le débogage lorsque votre code se retrouve dans des cas extrêmes impossibles. Affirmez vérifier ces cas impossibles.
Disons qu'il existe une fonction pour calculer le prix de l'article après remise:
ici, discounted_price ne peut jamais être inférieur à 0 et supérieur au prix réel. Donc, dans le cas où la condition ci-dessus n'est pas respectée, assert soulève une erreur d'assertion, ce qui aide le développeur à identifier que quelque chose d'impossible s'est produit.
J'espère que cela aide :)
la source
assert
est utile dans un contexte de débogage, mais ne doit pas être invoqué en dehors d'un contexte de débogage.Ma courte explication est:
assert
déclencheAssertionError
si expression est fausse, sinon continue simplement le code, et s'il y a une virgule quoi que ce soitAssertionError: whatever after comma
, et coder est comme:raise AssertionError(whatever after comma)
Un tutoriel connexe à ce sujet:
la source
assert
, mais pas quand utiliser (ou ne pas utiliser) unassert
; notant également qu'un anassert
peut être désactivé s'il__debug__
estFalse
utile.Dans Pycharm, si vous utilisez
assert
avecisinstance
pour déclarer le type d'un objet, il vous permettra d'accéder aux méthodes et aux attributs de l'objet parent pendant que vous codez, il se complétera automatiquement automatiquement.Par exemple, disons
self.object1.object2
est unMyClass
objet.la source
Comme
assert
indiqué dans d'autres réponses, les instructions sont utilisées pour vérifier l'état du programme à un moment donné.Je ne répéterai pas ce qui a été dit sur le message associé, les parenthèses ou l'
-O
option et la__debug__
constante. Consultez également le doc pour des informations de première main. Je vais me concentrer sur votre question: à quoi ça sertassert
? Plus précisément, quand (et quand non) faut-il utiliserassert
?Les
assert
instructions sont utiles pour déboguer un programme, mais déconseillées pour vérifier les entrées utilisateur. J'utilise la règle empirique suivante: conserver les assertions pour détecter une situation qui ne devrait pas se produire . Une entrée utilisateur peut être incorrecte, par exemple un mot de passe trop court, mais ce n'est pas un cas qui ne devrait pas se produire . Si le diamètre d'un cercle n'est pas deux fois plus grand que son rayon, vous êtes dans un tel cas ne devrait pas se produire .L'utilisation la plus intéressante, selon moi,
assert
est inspirée de la programmation par contrat telle que décrite par B. Meyer dans [Object-Oriented Software Construction] ( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction% 2C_2nd_Edition ) et implémenté dans le [langage de programmation Eiffel] ( https://en.wikipedia.org/wiki/Eiffel_(programming_language) ). Vous ne pouvez pas émuler complètement la programmation par contrat en utilisant l'assert
instruction, mais il est intéressant de garder l'intention.Voici un exemple. Imaginez que vous deviez écrire une
head
fonction (comme la [head
fonction dans Haskell] ( http://www.zvon.org/other/haskell/Outputprelude/head_f.html )). La spécification qui vous est donnée est: "si la liste n'est pas vide, retournez le premier élément d'une liste". Regardez les implémentations suivantes:Et
(Oui, cela peut s'écrire
return xs[0] if xs else None
, mais ce n'est pas le but) .Si la liste n'est pas vide, les deux fonctions ont le même résultat et ce résultat est correct:
Par conséquent, les deux implémentations sont (j'espère) correctes. Ils diffèrent lorsque vous essayez de prendre l'élément de tête d'une liste vide:
Mais:
Encore une fois, les deux implémentations sont correctes, car personne ne doit passer une liste vide à ces fonctions (nous sommes hors spécification ). C'est un appel incorrect, mais si vous faites un tel appel, tout peut arriver. Une fonction déclenche une exception, l'autre renvoie une valeur spéciale. Le plus important est: nous ne pouvons pas compter sur ce comportement . Si
xs
est vide, cela fonctionnera:Mais cela fera planter le programme:
Pour éviter quelques surprises, je voudrais savoir quand je passe un argument inattendu à une fonction. En d'autres termes: je voudrais savoir quand le comportement observable n'est pas fiable, car cela dépend de l'implémentation, pas de la spécification. Bien sûr, je peux lire les spécifications, mais les programmeurs ne lisent pas toujours attentivement les documents.
Imaginez si j'avais un moyen d'insérer la spécification dans le code pour obtenir l'effet suivant: lorsque je viole la spécification, par exemple en passant une liste vide à
head
, j'obtiens un avertissement. Ce serait une grande aide pour écrire un programme correct (c'est-à-dire conforme aux spécifications). Et c'est làassert
qu'entre en scène:Et
Maintenant nous avons:
Et:
Notez que
head1
jette unAssertionError
, pas unIndexError
. Cela est important parce qu'unAssertionError
n'est pas une erreur d'exécution: il signale une violation de la spécification. Je voulais un avertissement, mais j'obtiens une erreur. Heureusement, je peux désactiver la vérification (en utilisant l'-O
option), mais à mes risques et périls. Je vais le faire un crash est vraiment cher, et j'espère pour le mieux. Imaginez que mon programme soit intégré dans un vaisseau spatial qui traverse un trou noir. Je désactiverai les assertions et j'espère que le programme est suffisamment robuste pour ne pas planter aussi longtemps que possible.Cet exemple ne concernait que les conditions préalables, que vous pouvez utiliser
assert
pour vérifier les postconditions (la valeur de retour et / ou l'état) et les invariants (état d'une classe). Notez que la vérification des postconditions et des invariants avecassert
peut être fastidieuse:Vous n'aurez pas quelque chose d'aussi sophistiqué qu'Eiffel, mais vous pouvez cependant améliorer la qualité globale d'un programme.
Pour résumer, la
assert
déclaration est un moyen pratique de détecter une situation qui ne devrait pas se produire . Les violations de la spécification (par exemple en passant une liste vide àhead
) sont de première classe, cela ne devrait pas se produire . Par conséquent, bien que l'assert
instruction puisse être utilisée pour détecter toute situation inattendue, c'est un moyen privilégié de s'assurer que la spécification est remplie. Une fois que vous avez inséré desassert
instructions dans le code pour représenter la spécification, nous pouvons espérer que vous avez amélioré la qualité du programme car des arguments incorrects, des valeurs de retour incorrectes, des états incorrects d'une classe ... seront signalés.la source
format: assert Expression [, arguments] Lorsque assert rencontre une instruction, Python évalue l'expression. Si l'instruction n'est pas vraie, une exception est levée (assertionError). Si l'assertion échoue, Python utilise ArgumentExpression comme argument pour AssertionError. Les exceptions AssertionError peuvent être interceptées et gérées comme n'importe quelle autre exception à l'aide de l'instruction try-except, mais si elles ne sont pas gérées, elles termineront le programme et produiront une trace. Exemple:
Lorsque le code ci-dessus est exécuté, il produit le résultat suivant:
la source
Peut être utilisé pour garantir que les paramètres sont passés dans l'appel de fonction.
la source
if not user_key: raise ValueError()
2 derniers paragraphes ici: wiki.python.org/moin/UsingAssertionsEffectivelyassert
ne doit pas être utilisé pour la validation d'entrée , car soit la validation sera dépouillé si__debug__
estFalse
. L'utilisation d'assertions à des fins non déboguées peut également amener les utilisateurs à intercepter lesAssertionError
s résultants , ce qui peut rendre le débogage plus difficile au lieu de moins.la source
Fondamentalement, le mot clé assert signifie que si la condition n'est pas vraie, elle passe par une erreur d'assertion, sinon elle continue par exemple en python.
code-1
PRODUCTION:
code-2
PRODUCTION:
la source
assert
, mais ne répond pas quand utiliser (ou ne pas utiliser) unassert
.