2009-05-15 17 views

risposta

14

Prova questo:

def foo(self, blah=None): 
    if blah is None: # faster than blah == None - thanks to kcwu 
     blah = self.instance_var 
+0

Perfetto, grazie! –

+4

usa "è" per confrontare Nessuno è migliore (e più veloce) – kcwu

+0

@kcwu grazie per il suggerimento. Sapevo che erano diversi, ma ho fatto un punto di riferimento e ho trovato una grande differenza di prestazioni. – Unknown

2

no, perché l'istanza non esiste quando la classe definizione di funzione tempo

Bisogna riscrivere come segue

def function(self, arg1=val1, arg2=val2, arg3=None): 
    if arg3 is None: 
     arg3 = self.instance_var 

Questo è leggermente diverso da quello originale: non puoi passare arg3 con nessun valore se lo vuoi veramente.

Soluzione alternativa:

def function(self, arg1=val1, arg2=val2, **argd): 
    arg3 = argd.get('arg3', self.instance_var) 
-1

Un modo alternativo di fare questo sarebbe:

def foo(self, blah=None): 
    blah = blah or self.instance_var 

Questa versione più corta sembra migliore, specialmente quando v'è più di un argomento opzionale.

Utilizzare con cura. Vedere i commenti seguenti ...

+0

fai attenzione se blah == 0 – kcwu

+0

o False o un array vuoto ... breve: non farlo –

+0

come altri commentatori sottolineano, questo non è veramente Pythonic, poiché ha effetti inaspettati. –

5

Tutte le risposte che suggeriscono None sono corrette; Se si vuole fare in modo un chiamante può passare Nessuno come un argomento normale, utilizzare uno speciale sentinel e test con is:

class Foo(object): 
    __default = object() 
    def foo(self, blah=Foo.__default): 
    if blah is Foo.__default: blah = self.instavar 

Ogni chiamata a object() rende un oggetto unico, in modo tale che is sarà mai successo tra esso e qualsiasi altro valore. I due trattini di sottolineatura in __default significano "fortemente privato", il che significa che i chiamanti sanno che non dovrebbero provare a fare confusione con esso (e avrebbe bisogno di un po 'di lavoro per farlo, imitando esplicitamente il nome che il compilatore sta facendo).

Il motivo per cui non è possibile utilizzare semplicemente il codice che è stato postato, btw, è che i valori predefiniti valuteranno quando viene valutata l'istruzione def, non più tardi al momento della chiamata; e al momento della valutazione def, non esiste ancora self da cui prendere la variabile di istanza.

0
def foo(self, blah=None): 
    blah = blah if not blah is None else self.instance_var 

Questo funziona con Python 2.5 e in avanti e gestisce i casi in cui è bla stringhe vuote, liste e così via.

Problemi correlati