Leggendo l' Introduzione pratica alla programmazione funzionale di Mary Rose Cook , fornisce un esempio di anti-schema
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
da
- la funzione fa più di una cosa
- il nome non è descrittivo
- ha effetti collaterali
Come soluzione proposta, suggerisce di 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 il rovescio della medaglia di essere ancora meno testabile; almeno i format_bands potrebbero avere un unit test per verificare se fa ciò che è destinato, ma come testare la pipeline? O l'idea che le funzioni anonime siano così esplicative da non dover essere testate?
La mia applicazione reale per questo è nel tentativo di rendere il mio pandas
codice 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
O riscrivere 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?