`goto` en Python
Je dois utiliser goto
en Python. J'ai trouvé entrians goto
mais mon Python de mise en œuvre (Disponible 2.7.1 sur Mac) n'ont pas ce module, de sorte qu'il ne semble pas être portable. Il faut au moins travailler dans toutes les implémentations de Python qui soutiennent Disponible bytecode (esp. Je me soucie de Disponible et PyPy). Puis il y a cette question relative à la, et cdjc est goto
. Et ceux donnés par les réponses ci-dessous.
Je pouvais aller et construire le bytecode manuellement (c'est à dire écrire mon propre compilateur Python) parce qu'il y est une telle instruction (JUMP_ABSOLUTE
et amis). Mais je me demande si il ya un moyen plus facile. Est-il possible via inspect
ou afin d'appeler une seule instruction bytecode? J'ai aussi pensé à la compilation via Python et ensuite automatiquement la correction du générés bytecode Python.
Bien sûr, les gens vont se demander pourquoi et ne me donne aucune réponse utile si je ne l'explique pas pourquoi, j'ai vraiment vraiment besoin de cela. Donc en bref mon cas d'utilisation: je suis en train de traduire un C AST Python AST et de la compilation. Je peux mapper chaque flux logique (toutes les boucles et d'autres trucs) en quelque sorte de l'équivalent du code Python. Tout sauf goto
. Projets connexes: PyCParser (voir interpreter.py
), PyCPython, PyLua.
- La traduction de C pour Python? WTF. Juste... pourquoi diable aurait-on besoin de cela et comment cela pourrait-il être pratique? (Cela ressemble à une très amusant défi, certes.) Aussi, êtes-vous conscients du fait que ce module est en avril fools blague et ne fonctionne qu'en inspectant le code source et de faire hackery que je n'aurais jamais penser être la moindre portable?
- +1 pour le fait d'expliquer pourquoi vous pensez que vous avez besoin
goto
. - Ainsi, le facteur plaisir est en effet l'une des principales raisons. 🙂 Sinon, je pense qu'il pourrait être utile dans certains cas pour avoir quelque chose comme Python ou Lua intégré. Et pour le débogage de code C en général. Via PyPy JIT compiler, il pourrait même ne pas être que lente.
- Je ne pense pas que ce que vous essayez d'atteindre n'aura pas de pause d'une manière ou d'une autre les objets python' compte de référence.
- goto décorateur (Python recette)
- Ow, mon cerveau!
- Oui, regarde exactement ce que je cherchais (ce que je voulais dire par la correction du bytecode)! Mettez juste répondre à la question. 🙂 Travaille à la fois Disponible et PyPy.
- Voir aussi: entrian.com/goto/download.html
Vous devez vous connecter pour publier un commentaire.
Je sais ce que tout le monde pense:
Cependant, il pourrait y avoir quelques didactique cas où vous avez réellement besoin d'un
goto
.Ce python recette fournit la
goto
de commande en fonction de décorateur.Le goto décorateur (Python recette par Carl Cerecke)
Utilisation
Mise à jour
Voici deux autres implémentations compatible avec Python 3:
Vous pouvez avoir la seule valable en cas d'utilisation je n'ai jamais vu d'avoir besoin de
goto
en Python. 🙂La façon la plus simple à émuler avant
goto
en Python est l'utilisation d'exceptions, car ils peuvent sauter hors de toute profondeur d'imbrication des structures de contrôle.Cela devient poilu si vous avez besoin à l'appui de plus d'une destination, mais je pense qu'il pourrait être fait à l'aide de imbriquée
try/except
structures et de multiples classes d'exception, un pour chaque destination. Depuis C limitesgoto
à la portée d'une seule fonction, au moins vous n'aurez pas à vous soucier de la façon de faire ce travail à travers fonctions. 🙂 Bien sûr, il ne fonctionne pas pour inversergoto
s.Une autre chose à noter est que les exceptions en Python, alors que rapide par rapport à d'autres langues, sont encore plus lent que la normale structures de contrôle de flux tels que
while
etfor
.Ce qui pourrait être beaucoup de travail (mais peut-être pas plus que vous êtes déjà dans pour), mais si vous pouvez générer du bytecode Python plutôt que de source Python, vous n'aurais aucun problème à la mise en œuvre de
goto
, parce que Python bytecode (comme la plupart des pseudo-machine-langues) a parfaitement cromulentJUMP_ABSOLUTE
opcode.goto
en C, ceux-ci sont inverse de ceux. Et j'ai besoin d'une solution qui fonctionne toujours (sinon c'est pas la peine de le mettre en œuvre, de l'esp. si c'est compliqué).J'ai mis à jour mon python goto décorateur pour Python 3. Vous pouvez l'obtenir à https://github.com/cdjc/goto. Utilisation de goto au lieu de fonctions peut faire une machine de l'etat de près de 5 fois plus rapide.
La version pour python 2 est toujours disponible à http://code.activestate.com/recipes/576944-the-goto-decorator/ mais il a un certain nombre de bugs qui sont résolus dans le python version 3.
Il va y avoir certains des modèles communs de code à l'aide de
goto
est susceptible de suivre.Dans la plupart des cas, je pense que toutes les instructions goto permet de passer à un emplacement qui est à la fois plus tard, et en plus en enfermant bloc; Si un corps de la fonction suit ce modèle parfaitement, transformer le goto en exceptions, avec des étiquettes, comme l'exception des blocs.
D'autres cas de goto sautant d'un endroit à un autre dans le même bloc, car il sera utilisé dans une machine d'état. Cela peut probablement être traduit dans une boucle de dispatching; chaque région entre l'étiquette et le prochain devient une fonction; goto sont remplacés par les
next_state = 'labelname'; return
Le dernier cas, qui n'est ni de la ci-dessus et peut-être non-trivial, lorsque le saut est en un corps de boucle. Je n'ai pas de réponse pour l'instant.
next_state = 'label'
etc., la PyPy JIT ne peut pas vraiment l'optimiser que bien plus et je ne veux pas perdre ça.Ce n'est pas exactement ce que vous cherchez, mais écoutez-moi.
Il y a plusieurs années, mon fils et j'ai écrit une "Aventure" du jeu de BASE. Chaque emplacement dans le métro de jeu a été un numéro de ligne. Lorsque vous avez quitté un endroit à travers le tunnel en direction du nord, par exemple, vous êtes arrivé à un autre emplacement.
Le codage a été quelque chose comme
if response == 'N' GOTO 2400
. Alors les joueurs ont fini par aller tout en utilisant GOTOs.Je me demandais comment cela pourrait être fait en Python et est venu avec cette.
Peut-être que cette technique pourrait être utilisée pour d'autres applications où quelque chose comme un GOTO est nécessaire. Si vous fractionnez votre programme en morceaux qui sont des fonctions, la suite de "un peu bête" codage ferait l'affaire.
return('4')
pourquoi ne pas juste retour de la fonction elle-même:return l4
. Boucle principale devient alorswhile go: go = go()
Une version de travail a été fait: http://entrian.com/goto/.
Note: Il a été offert comme un poisson d'avril. de travail (si)
Cela va sans dire. Oui c'est drôle, mais NE pas l'utiliser.