J'ai abordé un peu Passé, mais j'ai trouvé un article qui l'expliquait d'une manière plus compréhensible, donc j'ai inclus le sens de la critique. Réimprimé du blog de Great Senior, c'est-à-dire que tout le mérite appartient à nos légendaires anciens élèves de cs
Traceback message
Traceback (most recent call last):
File "<pyshell#29>", line 3 in <module>
result = buggy(5)
File <pyshell#29>", line 5 in buggy
return f + x
TypeError: unsupported operand type(s) for +: 'function' and 'int'
Le message de traceback imprime le processus dans l'ordre chronologique lorsque l'erreur s'est produite. Le fond est le plus récent. Il y a deux messages de traceback dans un ensemble. Le premier File" <pyshell # 29> ", ligne 3 dans <module>
contient le nom du fichier contenant l'erreur, où (la ligne) se trouve l'erreur et l'erreur. Les trois noms de fonctions qui existent sont exprimés au format Fichier" <nom de fichier> ", ligne <numéro>, dans <fonction>
. Le second result = buggy (5)
reste tel quel, mais le code actuel est affiché.
Error messages Le message d'erreur est écrit sur la dernière ligne. message d'erreur` <type d'erreur>: <message d'erreur> ʻest décrit dans le format du type d'erreur (erreur de syntaxe, erreur de type, etc.) et les détails de l'erreur.
Debugging
def foo(x):
"""A random function.
>>> foo(4)
4
>>> foo(5)
5
"""
Depuis le terminal python3 -m doctest file.py
Vous pouvez utiliser python3 -m doctest file.py -v
pour vous dire quel test a réussi et lequel est resté bloqué.
En règle générale, la première ligne décrit spécifiquement ce que fait la fonction, laissant une ligne vide. Une explication détaillée est ici.
Si la cible de doctest
est une instruction unique (= une seule ligne qui ne se termine pas par un:
), utilisez la fonction doctest
appelée "run_docstring_examples". Cette fonction a trois arguments. Le premier est le nom de la fonction que vous souhaitez tester, le second est global ()
(= une fonction intégrée qui renvoie l'environnement global) et le troisième est True
(pour indiquer que nous souhaitons une sortie" verbeuse ": a catalogue de tous les tests exécutés.). À propos, tester une seule instruction s'appelle unit test.
Exhaustive unit testing is a hallmark of good program design. --_ Une bonne conception du programme est garantie par un test unitaire complet. _
En plus de cela, vous pouvez créer votre propre fonction de test ou créer un nouveau doctest.
Always run these doctests. Submitting an assignment without running doctests even once is practically throwing points away.
Es-tu sérieux. Je ne savais pas ça (rires)
def foo(x):
result = some_function(x)
return result // 5
Si vous ne savez pas où se trouve l'erreur même si vous écrivez le code, essayez imprimer
le résultat pour l'instant.
def foo(x):
result = some_function(x)
print('result is', result)
return other_function(result)
Et si possible, n'oubliez pas d'ajouter un mot au lieu de simplement imprimer
print(tmp) # harder to keep track
print('tmp was this:', tmp) # easier
Il est également efficace de le mettre après la boucle while
i = 0
while i < n:
i += func(i)
print('i is', i)
N'oubliez pas de supprimer le print
lorsque le test est terminé
Long-term debugging
En ce qui concerne les unités de projet, il est parfois préférable de ne pas déboguer instantanément. Dans un tel cas, il est pratique de faire comme suit
debug = True
def foo(n):
i = 0
while i < n:
i += func(i)
if debug:
print('i is', i)
Si vous n'aimez pas que les résultats s'affichent à chaque fois, changez-le en «false». Une variable qui l'utilise est appelée «flag».
Types of error
Syntax Error Cause:
--Il y a un problème avec le code
File "file name", line number
def incorrect(f)
^
SyntaxError: invalid syntax
«^» indique un code contenant une syntaxe inappropriée. Cela ne montre pas ce qui ne va pas, mais cela vous indique où se trouve la cause. Python vérifie d'abord cette «erreur de syntaxe» avant d'exécuter le code.
Indentation Error Cause:
--Il y a un problème avec l'indentation de la ligne de code
File "file name", line number
print('improper indentation')
IndentationError: unindent does not match any outer indentation level
Il montre où indenté incorrectement. Faites une distinction claire entre les fonctionnalités d'espace et d'onglet.
TypeError
Cause:
--Utilisation inappropriée des opérandes (max, mul etc.) et des opérateurs primitifs (nombres, etc.).
TypeError: unsupported operand type(s) for +: 'function' and 'int'
>>> square = 3
>>> square(3)
Traceback (most recent call last):
...
TypeError: 'int' object is not callable`
>>> add(3)
Traceback (most recent call last):
...
TypeError: add expected 2 arguments, got 1
NameError
Cause: -Utilisation de variables ou de fonctions non définies
File "file name", line number
y = x + 3
NameError: global name 'x' is not defined
notes: La raison du nom global
ici est que Python finira par entrer dans la zone globale à partir de la zone locale de la fonction contenant l'erreur.
IndexError
Cause:
File "file name", line number
x[100]
IndexError: tuple index out of range
simple spelling mistakes
bonjour
≠ Bonjour
≠ BONJOUR
. Lorsque vous voyez NameError
, il peut y avoir une erreur d'orthographe. Ou vous avez peut-être défini une variable ou une fonction avec une orthographe incorrecte.
Missing Parentheses Oublier de mettre les parenthèses, etc.
def fun():
return foo(bar() # missing a parenthesis here
fun()
Dans ce cas, python l'appelle SyntaxError
et pointe vers la ligne après la ligne avec le problème de parenthèses.
Missing close quotes C'est facile à trouver car python vous le dira spécifiquement.
File "file name", line "number"
return 'hi
^
SyntaxError: EOL while scanning string literal
EOL = "end of line"
= (assignment) vs. == (equality test)
=
est utilisé lors du passage d'une variable, et ==
est utilisé pour vérifier si les variables sont équivalentes. L'erreur typique est
if x = 3: # when should be "==" instead
Infinite Loops
La boucle while continue de tourner jusqu'à ce que la condition soit atteinte, il est donc facile d'y tomber.
i = 0
while i < 10:
print(i)
i, n = 0, 0
while i < 10:
print(i)
n += 1
Recommended Posts