Domanda

c'è un controllo che devo eseguire dopo ogni passaggio successivo in una funzione, quindi volevo definire quel passaggio come una funzione all'interno di una funzione.

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

quindi come posso ottenere gs per restituire 'a' da ry? Ho pensato di usare super ma penso che sia solo per le lezioni.

Grazie

C'è stata un po 'di confusione ... Voglio solo restituire a se a == b. se a! = b, allora non voglio che gs restituisca ancora nulla.

modifica : ora penso decoratori potrebbe essere la soluzione migliore.

È stato utile?

Soluzione

Questo dovrebbe permetterti di continuare a controllare lo stato e tornare dalla funzione esterna se aeb finisce mai lo stesso:

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]

Altri suggerimenti

Intendi?

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

Come menzionate " passaggi " in una funzione, sembra quasi che tu voglia un generatore:

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'

(I generatori ora possono anche fungere da coroutine, a partire da Python 2.5, usando nuova sintassi del rendimento .)

  

C'è stata un po 'di confusione ... I   desidera restituire a solo se a == b. Se   a! = b, quindi non voglio che gs ritorni   ancora niente.

Cerca quindi:

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

restituisci ry () esplicitamente invece di chiamarlo semplicemente.

Ho avuto un problema simile, ma l'ho risolto semplicemente cambiando l'ordine della chiamata.

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

in alcune lingue come javascript puoi persino passare una funzione come variabile in una funzione:

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

gs(a, b, ry);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top