Leggendo il Introduzione pratica alla programmazione funzionale di Mary Rose Cook, dona come un esempio di anti-pattern
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
poiché
- la funzione fa più di una cosa
- il nome non è descrittivo
- ha effetti collaterali
Come soluzione proposta, suggerisce la pipeline di funzioni anonime
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
Tuttavia questo mi sembra avere lo svantaggio di essere ancora meno controllabile; almeno format_bands potrebbe avere un test unitario per verificare se fa quello che è destinato a, ma come testare la pipeline? Oppure l'idea che le funzioni anonime siano così auto-esplicative da non dover essere testate?
La mia applicazione del mondo reale per questo sta cercando di rendere il mio codice pandas
più funzionale. Avrò spesso una sorta di pipeline all'interno di una funzione "munging" "
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
Oppure riscrivi nello stile della pipeline:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
Qualche suggerimento per le migliori pratiche in questo tipo di situazione?