python pour débutant
La sortie de Python 3.10 approche à grands pas et, comme nous l'avons signalé en mai, le nouvel interpréteur bénéficiera de plusieurs améliorations des messages d'erreur. Le travail sur l'amélioration des erreurs se poursuit dans Python 3.11.
Oui c'est vrai! Même si Python 3.10 ne sortira pas avant octobre, le travail sur Python 3.11 est déjà en cours !
Emplacements d'erreur précis dans les retraçages
Pablo Galindo, le gestionnaire de version pour Python 3.10 et 3.11, partagé dans un Tweet du 16 juillet 2021 que lui et l'équipe avaient terminé la mise en œuvre du PEP 657. Le PEP ajoute la prise en charge des « emplacements d'erreur à grain fin dans les retraçages » et constitue une mise à niveau importante de l'expérience utilisateur pour les développeurs Python nouveaux et expérimentés.
Fait amusant: UNE DYNAMISME est un Proposition d'amélioration Python et est la principale méthode dans laquelle les fonctionnalités proposées pour le langage Python sont documentées et partagées au sein de l'équipe de développement Python principale. Vous pouvez en savoir plus sur les PEP en lisant PEP 1—le tout premier PEP !
Pour illustrer à quel point le nouveau rapport d'emplacement d'erreur est précis, considérons l'extrait de code suivant, qui attribue la valeur 1
à la clé "ré"
dans un dictionnaire imbriqué nommé X
:
X[[[["une"][[[["b"][[[["c"][[[["ré"] = 1
Dans n'importe quelle version de Python 3 jusqu'à Python 3.10, si l'une des valeurs des clés "une"
, "b"
, ou alors "c"
sommes Rien
, puis l'exécution de l'extrait ci-dessus génère un Erreur-type
vous disant que vous ne pouvez pas souscrire un AucunType
:
Traceback (appel le plus récent en dernier) :
Fichier "test.py", ligne 2, dans
X[[[['une'][[[['b'][[[['c'][[[['ré'] = 1
Erreur-type: L'objet 'NoneType' n'est pas inscriptible
Cette erreur est exact, mais ce n'est pas utile. Quelle valeur est Rien
? Est-ce la valeur à X["a"]
, X["b"]
, ou alors X["c"]
? Trouver l'emplacement exact de l'erreur nécessite plus de débogage et peut être coûteux et chronophage.
Dans Python 3.11, le même extrait de code produit une trace avec quelques annotations utiles qui indiquent exactement où le Rien
la valeur se trouve :
Traceback (appel le plus récent en dernier) :
Fichier "test.py", ligne 2, dans
X[[[['une'][[[['b'][[[['c'][[[['ré'] = 1
~~~~~~~~~~~^^^^^
Erreur-type: L'objet 'NoneType' n'est pas inscriptible
Les caractères caret indiquent l'emplacement exact du AucunType
. Le coupable est X["c"]
! Plus besoin de deviner, plus de débogage. Le message d'erreur en lui-même vous donne toutes les informations dont vous avez besoin pour localiser la cause de l'erreur.
La communauté Python a accueilli ce changement avec d'énormes applaudissements. Le tweet de Pablo a recueilli plus de quatre mille likes au moment de la rédaction de cet article, et les commentaires sont remplis de développeurs Python exprimant leur gratitude.
Quelques développeurs ont réussi à trouver des cas extrêmes qui ne sont pas actuellement pris en charge, du moins pas dans l'implémentation actuelle. Par exemple, Will McGugan s'est demandé si le nouveau rapport de localisation fonctionnerait comme prévu pour les caractères asiatiques et les emojis. Ce fil Twitter a confirmé le manque de soutien.
Le changement a aussi un coût. Comme indiqué dans le PEP, la mise en œuvre nécessite « l'ajout de nouvelles données à chaque instruction de bytecode ».
Fait amusant: Vous entendez souvent Python appelé un langage interprété, mais ce n'est pas précis à 100%. En fait, le code Python est compilé à un langage de niveau inférieur appelé bytecode. Ce sont les instructions de bytecode générées par le compilateur qui sont interprétées par CPython, pas votre code Python.
Pour en savoir plus sur le fonctionnement de CPython sous le capot, consultez votre guide du code source de CPython ici sur Python réel.
Le résultat net des instructions bytecode ajoutées est une augmentation de 22% de la taille de la bibliothèque standard. .pyc
des dossiers. Cela ressemble à une augmentation significative, mais cela ne représente qu'environ 6 Mo, et l'équipe responsable du PEP estime que :
[T]C'est un nombre très acceptable car l'ordre de grandeur de la surcharge est très faible, surtout compte tenu de la taille de stockage et des capacités de mémoire des ordinateurs modernes…
Nous comprenons que le coût supplémentaire de ces informations peut ne pas être acceptable pour certains utilisateurs, nous proposons donc un mécanisme de désinscription qui empêchera les objets de code générés d'avoir les informations supplémentaires tout en autorisant pyc [sic] fichiers pour ne pas inclure les informations supplémentaires. (La source)
Le mécanisme d'opt-out consiste en un nouveau GAMMES PYTHONDEBUG
variable d'environnement ainsi qu'une nouvelle option de ligne de commande.
Vous pouvez lire le PEP 657 pour plus d'informations sur le nouveau rapport d'emplacement d'erreur. Vous pouvez trouver plus d'exemples de cette fonctionnalité en action dans le document What's New In Python 3.11.
Messages d'erreur améliorés pour les importations circulaires
Le développeur en résidence CPython, Łukasz Langa, a signalé dans son rapport hebdomadaire du 19 au 26 juillet qu'un message d'erreur amélioré pour les importations circulaires avait été ajouté à Python 3.11.
Considérez la structure de package suivante :
une
b
├── c.py
└── __init__.py
__init__.py
À l'intérieur a/b/__init__.py
est la ligne de code suivante :
Le c.py
le fichier contient cette ligne de code :
Cela donne lieu à une situation où le paquet b
dépend du module c
même si le module c
dépend aussi du paquet b
. Dans les versions Python jusqu'à Python 3.10, cette structure génère un message d'erreur cryptique :
Traceback (appel le plus récent en dernier) :
Fichier "" , ligne 1, dans
Fichier "/private/tmp/cpymain/a/b/__init__.py", ligne 1, dans
importer abc
Fichier "/private/tmp/cpymain/a/b/c.py", ligne 3, dans
une.b
AttributeError: le module 'a' n'a pas d'attribut 'b'
Des messages comme celui-ci ont frustré d'innombrables développeurs Python !
Grâce à une pull request du développeur CPython Filipe Laíns, le nouveau message d'erreur est beaucoup plus clair :
Traceback (appel le plus récent en dernier) :
Fichier "" , ligne 1, dans
Fichier "/private/tmp/cpymain/a/b/__init__.py", ligne 1, dans
importer abc
^^^^^^^^^^^^
Fichier "/private/tmp/cpymain/a/b/c.py", ligne 3, dans
une.b
^^^
AttributeError: ne peut pas accéder au sous-module 'b' du module 'a'
(probablement dû à une importation circulaire)
Une autre parenthèse a-t-elle le potentiel de sauver autant de coups de tête ?
Au moment de la rédaction de cet article, il n'est pas clair si cette modification a été ou non rétroportée vers Python 3.10. Vous devrez peut-être attendre un autre cycle de publication pour voir le nouveau message d'erreur.
[ad_2]