Читаючи практичне вступ до функціонального програмування Мері Роуз Кук , вона наводить як приклад антидіаграму
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
з тих пір
- функція виконує більше ніж одне
- назва не є описовим
- це має побічні ефекти
В якості запропонованого рішення вона пропонує конвеєрувати анонімні функції
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
Однак, мені здається, це є і меншою мірою бути ще менш перевіряемою; принаймні format_bands може мати тест одиниці, щоб перевірити, чи він робить те, що призначено, але як протестувати трубопровід? Або ідея про те, що анонімні функції настільки зрозумілі, що їх не потрібно перевіряти?
Моя реальна програма для цього полягає у намаганні зробити свій pandas
код більш функціональним. У мене часто є якийсь трубопровід всередині функції "заглушки"
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
Або переписування в стилі конвеєра:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
Будь-які пропозиції щодо найкращих практик у подібній ситуації?