Czytając praktyczne wprowadzenie Mary Rose Cook do programowania funkcjonalnego , podaje jako przykład anty-wzorca
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
od
- funkcja robi więcej niż jedną rzecz
- nazwa nie jest opisowa
- ma skutki uboczne
Jako zaproponowane rozwiązanie sugeruje anonimowe funkcje potokowe
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
Wydaje mi się jednak, że ma to tę wadę, że jest jeszcze mniej sprawdzalne; przynajmniej format_bands może mieć test jednostkowy, aby sprawdzić, czy robi to, co powinien, ale jak przetestować potok? Czy też pomysł, że funkcje anonimowe są tak oczywiste, że nie trzeba ich testować?
Moja aplikacja do tego celu polega na tym, aby mój pandaskod był bardziej funkcjonalny. Często mam jakiś potok wewnątrz funkcji „munging”
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
Lub przepisywanie w stylu potoku:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
Wszelkie sugestie dotyczące najlepszych praktyk w takiej sytuacji?