Classification des erreurs (python3.x) et notes de débogage

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

Allons-y avec Doctest pour le moment

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)

Vérifiez la progression en insérant print () dans les points importants

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

Bogues courants

simple spelling mistakes

bonjour BonjourBONJOUR. 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

Classification des erreurs (python3.x) et notes de débogage
exécution et erreur de pytube
Erreur de Golang et panique
Rapport sur le débogage et les tests
Remarques sur tf.function et traçage
Remarques sur les * args et ** kargs
Différence entre régression et classification
Notes sur pyenv et Atom