J'ai ajouté une fonction à CPython (opérateur ternaire)

introduction

Voici les étapes pour ajouter un opérateur ternaire à CPython. Cet article utilise Python 3.10. Veuillez vous référer à ici pour l'explication de la construction de CPython et de la structure des fichiers.

2. Ajout de l'opérateur ternaire

2.1 Opérateur ternaire Python

Les opérateurs ternaires Python sont: En Python, (valeur lorsque la condition est True) vient en premier, (condition) vient ensuite, et enfin (valeur lorsque la condition est False). Il n'est pas courant que (condition) soit au milieu de la syntaxe de l'opérateur ternaire.

(Valeur lorsque la condition est vraie) if (conditions) else (conditionsがFalseのときの値)

2.2 Opérateur ternaire modifié

L'opérateur ternaire modifié est le suivant. (Condition) vient en premier, puis (valeur lorsque la condition est True) et enfin (valeur lorsque la condition est False). En langage C etc., les opérateurs ternaires sont décrits dans cet ordre.


if (conditions) then (conditionsがTrueのときの値) else (conditionsがFalseのときの値)

2.3 Changement de code

Modifions maintenant l'opérateur ternaire Python par celui montré dans 2.2. L'opérateur ternaire existe déjà en Python. Ainsi, vous pouvez utiliser ceci et appeler le même processus si le cas échéant. Ici, seul python.gram est modifié. Il y a la description suivante dans L341 de Grammer / python.gram.

Grammer/python.gram


a = disjunction 'if' b=disjunction 'else' c=expression { _Py_IfExp(b, a, c, EXTRA) }

Ceci est une description de l'opérateur ternaire Python d'origine. Pour imiter cela, écrivez l'opérateur ternaire modifié sur la ligne ci-dessous.

Grammer/python.gram


'if' a = disjunction 'then' b=disjunction 'else' c=expression { _Py_IfExp(a, b, c, EXTRA) }

Ici, faites attention à l'ordre des variables lors de l'appel de _Py_IfExp. Avec les changements ci-dessus

$ make regen-pegen

Vous pouvez ajouter l'opérateur ternaire en exécutant et en reconstruisant. Bien entendu, vous pouvez également utiliser la syntaxe de l'opérateur ternaire d'origine.

3. Démo

L'opérateur ternaire implémenté par les changements ci-dessus fonctionne comme suit. Peek 2020-10-20 13-05.gif

Matériel de référence

Recommended Posts

J'ai ajouté une fonction à CPython (opérateur ternaire)
J'ai ajouté une fonction à CPython (construction et compréhension de la structure)
Comment appeler une fonction
J'ai fait une fonction pour vérifier le modèle de DCGAN
Ajout de la fonction de réussite à Sublime Text
Comment créer une fonction récursive
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai essayé de créer un linebot (implémentation)
Je veux imprimer dans la notation d'inclusion
J'ai essayé de créer un linebot (préparation)
J'ai demandé à la tortue de dessiner une fonction triangulaire
Je veux créer un environnement Python
Un simple script IDAPython pour nommer une fonction
J'ai essayé d'ajouter un post-incrément à l'implémentation CPython
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
J'ai fait un script pour afficher des pictogrammes
J'ai créé une API Web
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai essayé de créer une fonction de dictionnaire insensible à la casse
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
Je veux faire de matplotlib un thème sombre
J'ai essayé de créer une méthode de super résolution / ESPCN
Je souhaite créer facilement un modèle de bruit
Je veux INSÉRER un DataFrame dans MSSQL
Comment créer un objet fonction à partir d'une chaîne
J'ai essayé de créer une méthode de super résolution / SRCNN ①
Je veux créer une fenêtre avec Python
Je veux faire un jeu avec Python
Je ne veux pas passer un test de codage
J'ai créé un outil pour compiler nativement Hy
Je souhaite créer un type d'implémentation pouvant être branché
J'ai lu "Comment créer un laboratoire de piratage"
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une méthode de super résolution / SRCNN ②
J'ai créé un outil pour obtenir de nouveaux articles
J'ai essayé d'ajouter un post-incrément à l'édition CPython Extra
Je veux trouver facilement une délicieuse boutique
[Go] Comment écrire ou appeler une fonction
Je veux écrire dans un fichier avec Python
Comment se moquer d'une fonction publique dans Pytest
Je souhaite utiliser la fonction d'activation Mish
J'ai créé un jeu ○ ✕ avec TensorFlow
Je souhaite télécharger une application Django sur heroku
Opérateur Trinity (Python)
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de faire un "putain de gros convertisseur de littérature"
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux répéter plusieurs fois un générateur Python
Créer une fonction pour visualiser / évaluer le résultat du clustering
Je veux que DQN Puniki frappe un home run
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
Je veux donner un group_id à une trame de données pandas
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux faire la transition avec un bouton sur le ballon
J'ai fait une bibliothèque pour bien séparer les phrases japonaises