IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

PEP 762 : Remplacement de la console REPL par défaut de Python pour fournir des fonctionnalités modernes
Comme l'édition multi-lignes ou la coloration syntaxique

Le , par Jade Emy

67PARTAGES

5  0 
Voici la présentation de la PEP 762 pour remplacer la REPL par défaut. La nouvelle REPL vise à fournir des fonctionnalités telles que l'édition multi-lignes, la coloration syntaxique, les commandes personnalisées et une expérience interactive globalement améliorée. Cette proposition offrirait plusieurs avantages, notamment l'écriture de tests plus simple et plus directe, accélérer le développement des fonctionnalités et la correction des bogues, ainsi qu'une meilleure flexibilité des développeurs.

Une boucle de lecture-évaluation-impression (Read-Eval-Print Loop - REPL), également appelée shell interactif de premier niveau ou de langage, est un environnement de programmation informatique interactif simple qui prend des entrées utilisateur uniques, les exécute et renvoie le résultat à l'utilisateur. Un programme écrit dans un environnement REPL est exécuté de manière fragmentaire. Les exemples courants comprennent les shells de ligne de commande et les environnements similaires pour les langages de programmation, et la technique est très caractéristique des langages de script.

L'une des principales forces de Python est son mode interactif, également connu sous le nom de boucle de lecture, d'évaluation et d'impression (REPL), de console Python ou d'interpréteur de commandes Python. La PEP 762 (PEP pour Proposition d'amélioration de Python) décrit une nouvelle implémentation de cette fonctionnalité écrite en Python. La nouvelle REPL publiée dans Python 3.13 vise à fournir des fonctionnalités modernes attendues par les utilisateurs, telles que l'édition multi-lignes, la coloration syntaxique, les commandes personnalisées et une expérience interactive globalement améliorée.

Pourquoi un nouveau REPL ?

Jusqu'à Python 3.12, le shell interactif de CPython était écrit en C comme un mode spécial de l'analyseur. Il était donc difficile à maintenir et à étendre. Il dépendait de l'existence de GNU readline (ou d'un équivalent) pour des fonctionnalités de base comme le déplacement du curseur et le suivi de l'historique. Python compilé sans cette bibliothèque fournissait un mode interactif aux capacités très limitées. D'autre part, Python compilé avec readline externalisait les décisions et la configuration autour de l'entrée de l'utilisateur d'une manière qui rendait son extension difficile.

Cette complexité a découragé les contributions et a rendu difficile la mise en œuvre de nouvelles fonctionnalités. En conséquence, l'interpréteur de commandes interactif CPython n'a connu que des changements minimes, restant en deçà des attentes des utilisateurs pour des équivalents modernes.

De nombreuses fonctionnalités que les utilisateurs sont en droit d'attendre d'un shell interactif moderne étaient absentes de la version précédente. Parmi ces fonctionnalités, on peut citer l'édition multi-lignes et l'historique, les commandes personnalisées, la coloration syntaxique ou la gestion ergonomique du copier-coller. L'absence de ces fonctionnalités a un impact sur l'expérience de nombreux groupes d'utilisateurs de CPython, en particulier dans les environnements où les utilisateurs ne contrôlent pas les dépendances et ne peuvent pas installer leurs propres paquets. Ceci est particulièrement fréquent pour les utilisateurs qui apprennent le langage et les éducateurs.

La résolution de ces problèmes avec l'implémentation en C nécessiterait des solutions de contournement complexes, telles que la correspondance AST des commandes, ce qui ajouterait une complexité prohibitive à la base de code.

Le nouveau REPL écrit en Python répond donc à ces limitations tout en rendant l'expérience interactive de CPython plus conforme aux attentes et aux capacités modernes.


Les développeurs du noyau de Python commentent :


L'implémentation de la nouvelle REPL en Python, plutôt qu'en C, a considérablement réduit la barrière à l'entrée pour les contributeurs. Ce changement a facilité le test, la validation et la modification de la REPL, ce qui a permis d'accroître l'implication de la communauté et d'accélérer le développement des fonctionnalités. L'amélioration de l'accessibilité de la base de code devrait se traduire par une évolution plus rapide de la REPL et une plus grande réactivité de la part des utilisateurs.

Au lieu d'écrire un REPL Python à partir de zéro, nous avons décidé de baser l'implémentation du nouveau REPL sur PyREPL. Cette décision a été motivée par plusieurs facteurs clés. Tout d'abord, le développement d'une application de terminal qui fonctionne de manière cohérente sur différents systèmes d'exploitation et émulateurs de terminal est une entreprise complexe. En adoptant PyREPL, qui a été testé dans le cadre du projet PyPy, nous pouvons tirer parti d'un code existant et éprouvé plutôt que de partir de zéro.

Le partage d'une base de code avec PyPy pour l'implémentation de la REPL offre des avantages mutuels aux deux projets. Cela permet de partager les efforts de maintenance, de corriger plus rapidement les bogues et d'améliorer les fonctionnalités, ce qui peut profiter aux utilisateurs de CPython et de PyPy. Cette collaboration peut conduire à un REPL plus robuste et plus riche en fonctionnalités pour l'ensemble de l'écosystème Python.

La précédente REPL écrite en C s'appuyait sur les bibliothèques readline ou editline pour permettre certaines fonctionnalités telles que la navigation, la conservation et le rappel de l'historique, l'autocomplétion et le comportement configurable du clavier. PyREPL n'utilise pas ces bibliothèques, implémentant la plupart des autres fonctionnalités directement dans l'interpréteur de commandes. La principale fonctionnalité manquante (configurabilité de l'entrée) est compensée par les avantages de la nouvelle architecture. Les fichiers de configuration de ces bibliothèques (par exemple inputrc) sont complexes et incluent des fonctionnalités que PyREPL ne prévoit pas d'implémenter, ce qui rend infaisable l'ajout transparent de leur support dans le nouveau shell. L'utilisation de readline ou editline dans PyREPL serait prohibitivement complexe en raison de la gestion de l'édition multi-lignes et du support multiplateforme.

Bien que cela signifie que les configurations readline/editline existantes ne seront pas compatibles avec PyREPL, nous pensons que les fonctionnalités améliorées et l'extensibilité améliorée sont une victoire globale.

La version précédente du REPL ne permettait pas d'implémenter correctement les commandes personnalisées, ce qui est une caractéristique très courante des shells interactifs. Par exemple, la commande exit était implémentée comme un appel de méthode d'un objet personnalisé injecté dans l'espace de noms global, ce qui conduisait à un comportement non intuitif qui déroutait souvent les utilisateurs lorsqu'ils tapaient simplement exit, car l'interpréteur les invitait à l'utilisation supposée correcte exit().

Spécification

PyREPL est implémenté comme un nouveau module Python privé appelé _pyrepl, existant parallèlement à l'implémentation C actuelle. Dans sa première implémentation, il introduit les fonctionnalités clés suivantes :

  1. Historique et édition multilignes : Les utilisateurs pourront naviguer et éditer l'historique de leurs commandes sur plusieurs lignes, ce qui leur permet d'affiner et de réutiliser des blocs de code complexes.

    L'édition de blocs multilignes permet une indentation automatique de quatre espaces, ce qui est conforme aux recommandations du PEP 8. Lorsqu'une ligne se terminant par deux points est rencontrée, la ligne suivante est automatiquement indentée en utilisant le modèle d'indentation déduit de la première ligne indentée. Les lignes sont indentées de quatre espaces et les tabulations sont converties en espaces.

    Les utilisateurs peuvent accéder à l'historique des commandes en utilisant les flèches vers le haut et vers le bas. Dans une entrée multi-lignes, les touches fléchées permettent de naviguer ligne par ligne dans le bloc avant de passer à l'entrée suivante de l'historique. La flèche vers le bas fonctionne à l'inverse, en naviguant des entrées les plus anciennes aux plus récentes.

    L'historique peut être recherché en avant (en utilisant Ctrl+S) et en arrière (en utilisant Ctrl+R) à l'aide d'une requête de sous-chaîne personnalisée. Il est également possible d'effectuer une recherche à l'aide d'un préfixe en saisissant le préfixe dans une ligne du shell et en utilisant les touches PageUp et PageDown.
  2. Copier et coller : dans les émulateurs de terminal supportés, la capacité de collage entre crochets est découverte et utilisée par PyREPL. Cela permet de coller de manière transparente des blocs de code sans exécution immédiate ou indentation automatique invalide.

    Pour les émulateurs de terminal qui ne supportent pas ce mode, un mode de collage dédié est implémenté pour permettre l'insertion facile de bouts de code de plusieurs lignes sans déclencher d'exécution immédiate ou de problèmes d'indentation.

    Les utilisateurs entrent dans le mode de collage manuel en appuyant sur la touche F3. L'invite passe de >>> à (paste) où les utilisateurs peuvent coller le contenu de leur presse-papiers ou taper manuellement comme ils le souhaitent. Lorsque le contenu est prêt, la touche F3 permet de quitter le mode collage. Il suffit ensuite d'appuyer sur la touche Entrée pour exécuter le bloc.

    Les utilisateurs peuvent saisir plusieurs commandes sur une seule entrée lorsqu'ils utilisent le mode coller, ce qui les aidera à coller du code provenant d'autres sources.

    Pour copier des blocs de code sans les invites de commande principales et sans la sortie des commandes, les utilisateurs peuvent entrer dans l'affichage de l'historique via la touche F2. Ce mode utilise un pager pour afficher l'historique des commandes exécutées sans les invites et la sortie.
  3. Aide via F1.

    L'accès au module d'aide standard se fait par l'intermédiaire d'une commande personnalisée help ou de la touche F1. Appuyez sur F1 pour entrer dans le mode d'aide. Lorsque vous avez terminé, appuyez sur F1 ou sur une commande standard (q, quit ou exit) pour quitter.

    La consultation de l'aide interactive ne conserve pas l'historique des commandes.
  4. Commandes personnalisées : Le REPL prendra en charge l'implémentation de commandes personnalisées, telles que exit, d'une manière plus naturelle et conviviale, en évitant le contournement de l'appel de fonction actuel.

    La liste initiale des commandes personnalisées comprend :

    • exit
    • quit
    • copyright
    • help
    • clear

    Les commandes sont disponibles tant qu'il n'y a pas de conflit de nom avec une variable dans une portée atteignable. Par exemple, après avoir assigné exit = 1, la variable aura la priorité sur les commandes PyREPL. del exit dans ce cas supprimera le conflit et la commande fonctionnera à nouveau.
  5. Couleurs : les invites ainsi que certains éléments de la sortie, comme les traces d'exception, sont maintenant colorés. Les couleurs peuvent être désactivées à l'aide de la variable d'environnement standard NO_COLOR, ou forcées à l'aide de la variable d'environnement standard FORCE_COLOR. Une variable d'environnement spécifique à Python est également disponible, appelée PYTHON_COLORS. L'implémentation initiale dans Python 3.13 ne permet pas de personnaliser le thème des couleurs.

Ces fonctionnalités améliorent l'expérience interactive de Python, la rendant plus conforme aux environnements de développement modernes et aux attentes des utilisateurs. L'implémentation en Python offre plusieurs avantages :

  1. Tests et validation plus faciles : L'écriture de tests pour le code Python est plus simple et plus directe que pour le code C, ce qui permet une couverture de test plus complète des fonctionnalités existantes et anciennes.
  2. Barrière de contribution plus faible : L'accessibilité de Python par rapport au code C a encouragé la communauté à contribuer davantage, ce qui a permis d'accélérer le développement des fonctionnalités et la correction des bogues.
  3. Flexibilité : Une implémentation Python est plus facile à étendre et à modifier, ce qui améliore la vélocité des développeurs sur les nouvelles fonctionnalités et les améliorations apportées par les développeurs principaux et les contributeurs.


Source : Présentation de la PEP 762 (Github)

Et vous ?

Pensez-vous que cette PEP est crédible ou pertinente ?
Quel est votre avis sur le sujet ?

Voir aussi :

Python 3.13 est disponible : la première édition sans GIL de Python s'accompagne d'un compilateur Just-In-Time (JIT) expérimental, d'une amélioration du typage et de la gestion d'erreurs

Python et SQL en tête des langages des programmations les plus populaires de 2023 sur IEEE Spectrum. Java, C++, C et JavaScript complètent les tops 5

La prochaine version de l'interpréteur Python standard, CPython, va s'accompagner d'améliorations significatives des performances, ont annoncé les développeurs durant la PyCon

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 17/10/2024 à 11:49
Citation Envoyé par Jade Emy Voir le message
Pensez-vous que cette PEP est crédible ou pertinente ?
Quel est votre avis sur le sujet ?
Ceux qui ont besoin de ces fonctionnalités ont déjà IPython (et autres) qui y répond peu ou prou. D'ailleurs ici on ne crée rien sinon généraliser le pyREPL de l'implémentation PyPy de python à l'implémentation CPython.

Personnellement, comme je ne me sers de l'interpréteur interactif que comme aide mémoire ou tester de petit codes (le reste je le fais sous éditeur). Je n'ai jamais éprouvé le besoin de passer sosu un IPython ou équivalent. Maintenant, si demain, j'ai plus de fonctionnalités, je prends mais ce n'est pas essentiel.

- W
2  0