2012-04-05 4 views
36

Quando "decostruisco" una tupla, posso usare _ per indicare elementi tuple a cui non sono interessato, ad es.Come posso indicare argomenti di funzione non utilizzati?

>>> a,_,_ = (1,2,3) 
>>> a 
1 

Utilizzando Python 2.x, come posso esprimere lo stesso con gli argomenti di funzione? Ho cercato di usare sottolineature:

>>> def f(a,_,_): return a 
... 
    File "<stdin>", line 1 
SyntaxError: duplicate argument '_' in function definition 

Ho anche cercato di omettere solo l'argomento del tutto:

>>> def f(a,,): return a 
    File "<stdin>", line 1 
    def f(a,,): return a 
     ^
SyntaxError: invalid syntax 

C'è un altro modo per ottenere lo stesso?

+4

Perché non solo i valori predefiniti per i tuoi argomenti? Perché dovresti avere argomenti non utilizzati in una funzione? – jamylak

+4

@jamylak: Uso un framework che si aspetta che io passi le callebles in vari luoghi. Tuttavia, in molti casi, in realtà non ho bisogno di tutti gli argomenti passati dal framework. –

+5

@FrerichRaabe se il framework richiede argomenti particolari allora sembrerebbe più pulito solo per usare gli stessi nomi che il framework definisce per ogni argomento indipendentemente dal fatto che la funzione li usi o no. Ciò significa anche che non è necessario modificare la firma della funzione quando in seguito si scoprirà che sono necessari gli altri argomenti. – Duncan

risposta

19

Ecco quello che faccio con argomenti inutilizzati:

def f(a, *unused): 
    return a 
+0

Hm, bello! Funziona anche con lambda. Tuttavia, cosa fare se voglio ignorare il primo e il terzo argomento ma non il secondo? –

+1

@FrerichRaabe: quindi devi ancora scrivere il primo. Mi dispiace per quello –

+0

Vedo. Peccato, nel mio caso sono in realtà i primi (o i primi due) argomenti che voglio ignorare. Tuttavia, il tuo approccio è buono a sapersi, grazie per la condivisione! +1 da me. –

2

Se si dispone di entrambi i args e parola chiave arg si dovrebbe usare

def f(a, *args, **kwargs): 
    return a 
+0

pylint dice che args e kwargs non sono usati ... –

50

Un modo divertente Ho solo pensato di è quello di eliminare la variabile:

def f(foo, unused1, unused2, unused3): 
    del unused1, unused2, unused3 
    return foo 

Questo ha numerosi vantaggi:

  • la variabile non utilizzata può ancora essere utilizzato quando si chiama la funzione sia come argomento posizionale e come argomento chiave
  • se si inizia ad utilizzare in un secondo momento non si può dal momento che è cancellato, così c'è meno rischio di errori
  • è standard python syntax
  • pycharm fa la cosa giusta!
+2

Mi piace molto il consiglio e lo adotterò. Aggiungerei ancora un piccolo commento come '# Ignored parameters' poiché l'intento non è proprio quello di" eliminare "le variabili. – Teebrin

+3

Grande, questa è l'UNICA risposta che tratta i parametri inutilizzati LEADING, al contrario del trailing. Gli altri dovrebbero essere downvoted o cancellati;) –

+1

L'ottimizzatore rileva questo? – Pepedou

1

Penso che la risposta accettata è male, ma può ancora funzionare, se si utilizza quello che dovrei chiamare "via Perl" di trattare con argomenti (non so Perl davvero, ma ho smesso cercando di imparare dopo aver visto la sintassi sub, con l'argomento manuale decompressione):

La tua funzione ha 3 argomenti - questo è ciò che viene chiamato con (digitare Duck, ricordi?). Così si ottiene:

def funfun(a, b, c): 
    return b * 2 

2 parametri inutilizzati. Ma ora, inserire una migliore approccio larsmans':

def funfun(*args): 
    return args[1] * 2 

E ci vanno gli avvertimenti ...

Tuttavia, mi piace ancora di più la strada del boxed:

def funfun(a, b, c): 
    del a, c 
    return b * 2 

Mantiene l'auto documentare la qualità dei nomi dei parametri. Sono una caratteristica, non un bug.

Ma, il linguaggio in sé non ti costringe a farlo - potresti anche fare il contrario, e lasciare che tutte le tue funzioni abbiano la firma (*args, **kwargs), e eseguire l'analisi manualmente ogni volta. Immagina il livello di controllo che ti dà. E non più eccezioni quando viene chiamato in modo deprecato dopo aver cambiato la tua "firma" (argomento conteggio e significato).Questo è qualcosa che vale la pena di considerare;)

+1

Penso che il fatto che tu abbia scritto un commento "# inutilizzato" è un suggerimento che in realtà non è così auto-documentante o idiomatico da usare "del" in questo modo. –

+0

OK, ho rimosso il commento. Ora è davvero auto-documentante. (E seriamente: stai sostenendo che "ignorare" non è auto-documentante. Non mi interessa se l'ignore è auto-documentante, ma se l'API è auto-documentante). –

+0

Ciò non rende l'API auto-documentante. Inoltre, ciò che è fatto è fatto e non può essere annullato: il fatto che tu sentissi che era necessario scrivere un commento in primo luogo, suggerisce che non è in realtà chiaro cosa sta facendo 'del'. O pensi che il codice oscuro diventi meno oscuro se rimuovi i commenti da esso? –

24

Il trattino di sottolineatura viene utilizzato per le cose che non ci interessano e * in * args indica un elenco di argomenti. Pertanto, possiamo usare * _ per indicare una lista delle cose che non ci preoccupiamo:

def foo(bar, *_): 
    return bar 

passa anche assegni PyCharm.

+0

Questo è in Python 3. – Andreas

+0

Io uso '_name' come' _rubbish' per i parametri di throwaway per tre ragioni: a) Pycharm non mostra più l'avviso. b) Ricordo ** cosa ** butto via. c) Non c'è conflitto con un singolo carattere di sottolineatura. – Thinkeye

+0

_name è usato per denotare variabili semi-private/attributi di classe. Usarlo qui non ha senso in quanto l'obiettivo è ignorare l'input. Tuttavia, ha così poco senso che è improbabile che causi confusione con l'uso convenzionale di _name. –