2009-01-13 7 views
1

Il y a une vérification que je dois effectuer après chaque étape suivante dans une fonction, donc je voulais définir cette étape comme une fonction dans une fonction.Rendre une fonction parente return - super return?

>>> def gs(a,b): 
... def ry(): 
...  if a==b: 
...  return a 
... 
... ry() 
... 
... a += 1 
... ry() 
... 
... b*=2 
... ry() 
... 
>>> gs(1,2) # should return 2 
>>> gs(1,1) # should return 1 
>>> gs(5,3) # should return 6 
>>> gs(2,3) # should return 3 

alors comment puis-je obtenir gs pour retourner 'a' de ry? J'ai pensé utiliser Super mais je pense que c'est seulement pour les cours.

Merci

Il y a eu un peu de confusion ... Je veux seulement revenir un si a == b. Si a! = b, je ne veux pas que gs retourne quoi que ce soit.

éditer: Je pense maintenant que decorators pourrait être la meilleure solution.

Répondre

2

Cela devrait vous permettre de continuer à vérifier l'état et de revenir de la fonction externe si a et b jamais finir le même:

def gs(a,b): 
    class SameEvent(Exception): 
     pass 
    def ry(): 
     if a==b: 
      raise SameEvent(a) 
    try: 
     # Do stuff here, and call ry whenever you want to return if they are the same. 
     ry() 

     # It will now return 3. 
     a = b = 3 
     ry() 

    except SameEvent as e: 
     return e.args[0] 
+0

c'est un peu hackish, mais j'aime ça! très intelligent :) – Jiaaro

10

Voulez-vous dire?

def gs(a,b): 
    def ry(): 
     if a==b: 
      return a 
    return ry() 
1

Vous renvoyez ry() explicitement au lieu de simplement l'appeler.

3

Il y a eu un peu de confusion ... I ne veut retourner un si a == b. si a! = b, alors je ne veux pas que gs retourne quoi que ce soit pour le moment.

Vérifier que puis:

def gs(a,b): 
    def ry(): 
     if a==b: 
      return a 
    ret = ry() 
    if ret: return ret 
    # do other stuff 
+0

si a = b = 0? – Ben

4

Comme vous le mentionnez « pas » dans une fonction, il semble presque comme vous voulez un générateur:

def gs(a,b): 
    def ry(): 
    if a==b: 
     yield a 
    # If a != b, ry does not "generate" any output 
    for i in ry(): 
    yield i 
    # Continue doing stuff... 
    yield 'some other value' 
    # Do more stuff. 
    yield 'yet another value' 

(générateurs peuvent désormais agir aussi comme coroutines, depuis Python 2.5, en utilisant le new yield syntax.)

+1

ce n'est pas vraiment la réponse à ma question, MAIS cela résout le problème que j'essayais de réaliser :) – Jiaaro

+0

@All: Vous ne pourriez utiliser le rendement que dans la fonction interne si vous voulez que la fonction externe reste une fonction normale , et ne pas avoir à parcourir le résultat. –

1

J'ai eu un problème similaire, mais a résolu le problème en changeant simplement l'ordre de l'appel.

def ry() 
    if a==b 
     gs() 

dans certaines langues comme javascript vous pouvez même passer une fonction comme variable dans une fonction:

function gs(a, b, callback) { 
    if (a==b) callback(); 
} 

gs(a, b, ry); 
Questions connexes