fazer uma função pai retorno - super retorno?
Pergunta
não é um cheque que eu preciso para executar após cada etapa subseqüente em uma função, então eu queria definir essa etapa como uma função dentro de uma função.
>>> 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
Então, como faço para obter gs para retornar 'a' de dentro ry? Pensei em usar super, mas acho que é apenas para classes.
Graças
Houve uma pequena confusão ... Eu só quero voltar a se a == b. se um! = b, então eu não quero gs para retornar nada ainda.
Editar : agora eu acho que decoradores pode ser a melhor solução.
Solução
Isto deve permitir-lhe manter a verificação do estado e de retorno da função externa se a e b nunca acabar o mesmo:
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]
Outras dicas
Você quer dizer?
def gs(a,b):
def ry():
if a==b:
return a
return ry()
Como você menciona "passos" em uma função, parece quase como você quer um gerador:
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'
(Geradores agora também pode actuar como co-rotinas, uma vez que o Python 2.5, utilizando o nova sintaxe rendimento .)
Houve uma pequena confusão ... I só quer voltar a se a == b. E se um! = b, então eu não quero gs para retornar nada ainda.
Verifique se que, em seguida:
def gs(a,b):
def ry():
if a==b:
return a
ret = ry()
if ret: return ret
# do other stuff
você retornar ry () explicitamente em vez de apenas chamando-o.
Eu tive um problema semelhante, mas resolveu simplesmente mudando a ordem da chamada.
def ry ()
if a==b
gs()
em algumas linguagens como javascript você pode até mesmo passar uma função como uma variável em uma função:
function gs(a, b, callback) {
if (a==b) callback();
}
gs(a, b, ry);