2012-01-11 10 views
7

Questo è il mio codice:Passo vuoto/funzione noop/lambda come argomento di default

def execute(f, *args): 
    f(args) 

volte mi voglio passare alcuna funzione f-execute, quindi voglio f per impostazione predefinita alla funzione vuota.

+1

Quale errore? E perché il tuo parametro si chiama 'function', ma tu chiami' f'? –

+3

Probabilmente hai ricevuto il messaggio di errore 'nome globale 'f' non è definito 'perché, beh,' f' non è definito. Se hai un messaggio di errore diverso, specifica quale (tracciamento completo, per favore). –

risposta

6

Non capisco molto bene cosa stai cercando di fare
Ma qualcosa del genere dovrebbe funzionare per te?

def execute(func=None, *args, **kwargs): 
    if func: 
     func(*args, **kwargs) 

È inoltre possibile aggiungere un'altra istruzione per fare quello che vuoi.

+1

Sì, funziona. Stavo cercando di sbarazzarmi di questa affermazione "se". – Randomblue

+0

in questo caso se func è def func(): pass. Non hai bisogno del se. solo func (* args, ** kwargs) –

10

Il problema è che a volte non si vuole passare alcun argomento da eseguire, quindi voglio che la funzione sia predefinita alla funzione vuota.

funziona bene per me:

>>> def execute(function = lambda x: x, *args): 
... print function, args 
... function(args) 
... 
>>> execute() 
<function <lambda> at 0x01DD1A30>() 
>>> 

faccio notare che il vostro esempio tenta di utilizzare f nell'ambito dell'attuazione, mentre tu hai chiamato il parametro function. Potrebbe essere davvero così semplice? ;)

Detto questo, è necessario capire che Python non avrà alcun senso dire che si desidera ignorare l'argomento in default a meno che non ci sono argomenti a tutti, quindi execute(0) non può funzionare come di cercare di riparare 0 in funzione .

+0

Siamo spiacenti, la domanda era terribilmente formulata. L'ho riscritto. – Randomblue

+6

Per renderlo ancora più generico, renderlo 'lambda * x, ** xx: None'. Ora è effettivamente una funzione no-op universale - accetta qualsiasi numero di argomenti e argomenti di parole chiave. –

6

una funzione anonima ritorno Nessuno è spesso un adeguato no-op:

messaggio
def execute(func=lambda *a, **k: None, *args, **kwargs): 
    return func(*args, **kwargs) 
+0

Immagino che questo significhi che non c'è alcuna notazione più breve per 'lambda * a, ** k: None'. Ho provato 'func = pass', ma ovviamente non ha funzionato. – kasperd

Problemi correlati