La funzione ha due insiemi di argomenti, l'ultimo dei quali chiama una funzione nidificata? [chiuso]

2

La funzione foo, ha una funzione nidificata; bar. Chiamando foo con una seconda serie di argomenti li si inserisce nella barra se la barra viene restituita alla fine di foo. Come funziona e come si chiama?

Ci sono usi per aver semplicemente un unico set di argomenti che chiama normalmente la funzione?

def foo(arg1):
    print(arg1)
    def bar(arg2,arg3):
        print (arg2,arg3)
    return bar

foo("hello")("hello","world")

>>>
hello
hello world
    
posta user124757 01.10.2014 - 21:21
fonte

2 risposte

9

Si chiama programmazione di ordine superiore o, usando le funzioni come valori di prima classe. In questo caso, una funzione restituisce una funzione.

L'uso di esso rispetto a un semplice insieme di argomenti diventa evidente solo quando non viene fornito il "secondo set di argomenti", cioè quando foo("hello") viene usato da solo (passato in un'altra funzione o memorizzato in una variabile ). Questo di solito è utile solo se, a differenza dell'esempio della domanda originale, arg1 è usato all'interno della barra. La risposta che coinvolge getErrorHandler illustra questo caso più utile, che può anche essere pensato come una chiusura.

Anche se "avere un secondo gruppo di argomenti" può essere un utile modello mentale, e corrisponde al modo in cui appare quando "completamente chiamato" (saturo), questi argomenti extra non appartengono veramente a foo, appartengono alla barra.

    
risposta data 02.10.2014 - 00:57
fonte
4

Non posso parlare con Python di questo, ma negli schemi che usano frequentemente gestori di funzioni / callback, userò il tuo costrutto per crearli:

def getErrorHandler(message):
    def onError(error):
        print message + ":" + error
    return onError

panicHandler = getErrorHandler("Panic");
warningHandler = getErrorHandler("Warning");
...
panicHandler("Universe imploding");

Output:

Panic: Universe imploding
    
risposta data 01.10.2014 - 21:52
fonte

Leggi altre domande sui tag