OVH Cloud OVH Cloud

goto en python

36 réponses
Avatar
jean-michel
Dans le niouze anglais, j'ai trouvé 2 messages qui intéresseront ceux qui
veulent le GOTO en python.
Beurk diront certains.
Mais ceux qui essayent de migrer de vieilles appli en GW-Basic ou autre
pourraient bien apprécier...

J'ai pas tout compris dans le premier, je vous le livre tel que:
----------------------------------------------------------------------------
-------------------------------
On peut utiliser le goto seulement si on programme avec des numéros de
ligne:
"""
10 import sys
20 real_stdout = sys.stdout
30 class fake_stdout(object): pass
40 fake_stdout.write = lambda x, y: None
50 sys.stdout = fake_stdout()
60 import this
70 sys.stdout = real_stdout
80 d = {}
90 c = 65
100 i = 0
110 d[chr(i+c)] = chr((i+13) % 26 + c)
120 if i == 26: goto(150)
130 i += 1
140 goto(110)
150 if c == 97: goto(180)
160 c = 97
170 goto(100)
180 print "How zen it is:"
190 print "".join([d.get(c, c) for c in this.s])
"""
z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]

def goto(n): global l; l = k[m[n]-1]

while l and l <= k[-1]: exec z[l]; l = l != k[-1] and k[m[l]+1]
--
Michael Hoffman
----------------------------------------------------------------------------
-------------------------------
Le deuxième est un lien vers un module qui ajoute le goto à python.
http://entrian.com/goto/index.html
Je n'ai pas vérifié si ça marche.
----------------------------------------------------------------------------
-------------------------------
++jm

10 réponses

1 2 3 4
Avatar
Rico Demono
Merci beaucoup ça faisait un moment que je cherchais quelque chose comme ça !

Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?

--
Rico
Avatar
atchoum
Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?


if a == 'valeur1':
print 'valeur1
elif a == 'valeur2':
print 'valeur2'
else:
print 'autre valeur'

Bye
Jean-Pierre

Avatar
bruno modulix
Rico Demono wrote:
Merci beaucoup ça faisait un moment que je cherchais quelque chose comme ça !


Masochiste ?-)

Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?


j'en connais au moins trois :
1/ utiliser un if/elif/elif/.../else
(pas besoin d'exemple...)
Avantage : c'est simple et clair
Inconvénient : il y a autant de tests que de cas, ce qui peut être ch...
s'il y a beaucoup de cas


2/ utiliser un dictionnaire et des fonctions 'internes':

def ma_fonction_qui_switche(switch_arg, **kwargs):
def case_1():
...
def case_2():
...
def case_n():
...

{1 : case_1, 2: case_2, ..., n: case_n}[switch_arg]()

(Si le code des cases est un simple expression, remplacer les fonctions
internes par des lambdas)

C'est amha l'idiome le plus pythonesque et le plus clair.


3/ (OO) utiliser le polymorphisme pour avoir un 'dispatch' dynamique

class Case1:
def la_fonction(self, ...): pass

class Case2:
def la_fonction(self, ...): pass

class CaseN:
def la_fonction(self, ...): pass

# obj est une instance de Case1 ou de Case2 ou ... de CaseN

obj.la_fonction(...)

Cette dernière solution n'est pas toujours utilisable ou appropriée,
mais le fait est qu'on voit moins de switch en POO qu'en procédural...

Mes deux centimes...

--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
--

Avatar
bruno modulix
jean-michel wrote:
Dans le niouze anglais, j'ai trouvé 2 messages qui intéresseront ceux qui
veulent le GOTO en python.
Beurk diront certains.


En effet : *Beurk* !-)

Mais ceux qui essayent de migrer de vieilles appli en GW-Basic


Ce n'est probablement pas comme ça que je m'y prendrais le cas échéant...

ou autre


<troll>
et ceux qui veulent faire du Perl en Python...
</troll>

pourraient bien apprécier...

J'ai pas tout compris dans le premier, je vous le livre tel que:
-------------------------------
On peut utiliser le goto seulement si on programme avec des numéros de
ligne:
"""
10 import sys
20 real_stdout = sys.stdout
30 class fake_stdout(object): pass
40 fake_stdout.write = lambda x, y: None
50 sys.stdout = fake_stdout()
60 import this
70 sys.stdout = real_stdout
80 d = {}
90 c = 65
100 i = 0
110 d[chr(i+c)] = chr((i+13) % 26 + c)
120 if i == 26: goto(150)
130 i += 1
140 goto(110)
150 if c == 97: goto(180)
160 c = 97
170 goto(100)
180 print "How zen it is:"
190 print "".join([d.get(c, c) for c in this.s])
"""
z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]

def goto(n): global l; l = k[m[n]-1]

while l and l <= k[-1]: exec z[l]; l = l != k[-1] and k[m[l]+1]


zut, je viens de vomir sur mon clavier... C'est malin, maintenant faut
tout que je nettoie...

Non, sérieusement, à quoi ça sert que le BDFL se donne la peine de nous
pondre un langage lisible, si c'est pour en faire une pareille horreur?
C'est de la perversité, là !-)


--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"
--

Avatar
jean-michel
"bruno modulix" a écrit dans le message de
news:420c801e$0$29234$
Rico Demono wrote:
Merci beaucoup ça faisait un moment que je cherchais quelque chose comme
ça !



Masochiste ?-)


Pour bientôt, je vous promet quelque chose à propos des cartes perforées...

++jm


Avatar
Alex Marandon
On 2005-02-11, bruno modulix wrote:
Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?
[...]


3/ (OO) utiliser le polymorphisme pour avoir un 'dispatch' dynamique

class Case1:
def la_fonction(self, ...): pass

class Case2:
def la_fonction(self, ...): pass

class CaseN:
def la_fonction(self, ...): pass

# obj est une instance de Case1 ou de Case2 ou ... de CaseN

obj.la_fonction(...)


Je ne vois pas l'intérêt de faire ça, car il faudra bien un branchement
conditionnel pour choisir la classe à instancier pour obj, non ?


Avatar
Alex Marandon
On 2005-02-11, bruno modulix wrote:
[...]
z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); k = [0] + sorted(z.keys()); m = dict((b,a) for
a,b in enumerate(k)); l = k[1]
[...]



Non, sérieusement, à quoi ça sert que le BDFL se donne la peine de nous
pondre un langage lisible, si c'est pour en faire une pareille horreur?
C'est de la perversité, là !-)


Ouaip, on dirait ta signature ;-)


Avatar
jean-michel
"bruno modulix" a écrit dans le message de
news:420c812a$0$13407$
Non, sérieusement, à quoi ça sert que le BDFL se donne la peine de nous
pondre un langage lisible, si c'est pour en faire une pareille horreur?
C'est de la perversité, là !-)


Non, c'est simplement que parfois si tu ne peux pas reprendre une vieille
appli qui ne tourne plus que sur un vieux PC msdos (qui justement vient de
tomber en rade...), tu n'a plus qu'à trouver la solution miracle pour migrer
le + vite possible.
Les applications héritées sont une réalité en entreprise. Plus personne n'en
veux (d'où le beurk), sauf l'utilisateur évidemment.

Cela dit, si tu me trouves un algorithme de migration qui me sort un
programme python tout joli à partir d'un vieux code en cobol ou en basic
plein de gotos, je suis (très) intéressé...;-)

++jm

Avatar
Do Re Mi chel La Si Do
Bonjour !

Pas mal, le truc. C'est carrément un petit interpréteur, en quelques lignes.
En tout cas, ça montre la puissance de Python (malgré ceux qui n'aiment pas
"exec").

Mais ça reste d'un usage limité.
--
Michel Claveau
Avatar
Yermat
Alex Marandon wrote:
On 2005-02-11, bruno modulix wrote:

Dans le même ordre d'idées, quelqu'un connait une asctuce pour avoir un
switch/case ?



[...]

3/ (OO) utiliser le polymorphisme pour avoir un 'dispatch' dynamique

class Case1:
def la_fonction(self, ...): pass

class Case2:
def la_fonction(self, ...): pass

class CaseN:
def la_fonction(self, ...): pass

# obj est une instance de Case1 ou de Case2 ou ... de CaseN

obj.la_fonction(...)



Je ne vois pas l'intérêt de faire ça, car il faudra bien un branchement
conditionnel pour choisir la classe à instancier pour obj, non ?


Pas forcément, ça peut venir d'un fichier de configuration, ou de l'IHM
par exemple, ou d'un objet factory qui dépend de...

--
Yermat



1 2 3 4