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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top