Читая практическое введение Мэри Роуз Кук в функциональное программирование , она приводит пример анти-паттерна.
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
Любые предложения для лучших практик в такой ситуации?