Pregunta

hay una comprobación que debo realizar después de cada paso posterior de una función, por lo que quería definir ese paso como una función dentro de una función.

>>> 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

Entonces, ¿cómo hago para que gs devuelva 'a' desde dentro? Pensé en usar super pero creo que es solo para clases.

Gracias

Ha habido una pequeña confusión ... Solo quiero devolver a si a == b. si a! = b, entonces no quiero que gs devuelva nada todavía.

editar : ahora creo que decoradores podría ser la mejor solución.

¿Fue útil?

Solución

Esto debería permitirle seguir comprobando el estado y regresar de la función externa si a y b alguna vez terminan igual:

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]

Otros consejos

¿Quieres decir?

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

Como mencionas "pasos" en una función, casi parece que quieres un generador:

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'

(Los generadores ahora también pueden actuar como corutinas, desde Python 2.5, usando nueva sintaxis de rendimiento .)

  

Ha habido una pequeña confusión ... yo   solo desea devolver a si a == b. Si   a! = b, entonces no quiero que gs regrese   cualquier cosa todavía.

Verifique eso entonces:

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

devuelve ry () explícitamente en lugar de simplemente llamarlo.

Tuve un problema similar, pero lo resolví simplemente cambiando el orden de la llamada.

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

en algunos idiomas, como JavaScript, incluso puede pasar una función como variable en una función:

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

gs(a, b, ry);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top