Supponiamo che tu abbia una funzione che deve mantenere una sorta di stato e comportarsi diversamente a seconda di quello stato. Sono a conoscenza di due modi per implementare questo, dove lo stato è memorizzato esclusivamente dalla funzione:Python - Attributi di funzione o valori predefiniti mutabili
- Utilizzando un attributo funzione di
- Utilizzando un valore di default mutabile
Utilizzando una versione leggermente modificata di Felix Klings answer to another question , qui è una funzione di esempio che può essere utilizzato in re.sub()
modo che solo la terza partita di una regex sarà sostituito:
attributo funzione:
def replace(match):
replace.c = getattr(replace, "c", 0) + 1
return repl if replace.c == 3 else match.group(0)
Mutevole valore predefinito:
def replace(match, c=[0]):
c[0] += 1
return repl if c[0] == 3 else match.group(0)
Per me la prima sembra più pulito, ma ho visto il secondo più comunemente. Quale è preferibile e perché?
La gente semplicemente non pensa della funzione attributi perché non sono che ampiamente utilizzati da principianti, ma _everyone_ pensa di utilizzare il valore predefinito mutevole perché _ogni_ principiante viene morso da loro almeno una volta. – agf