Quoi de neuf à partir de juillet 2021 ? – Vrai Python

By | août 16, 2021

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.

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 ».

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]