Lendo a Introdução Prática à Programação Funcional de Mary Rose Cook , ela oferece um exemplo de anti-padrão
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
Desde a
- a função faz mais de uma coisa
- o nome não é descritivo
- tem efeitos colaterais
Como solução proposta, ela sugere pipelining de funções anônimas
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
No entanto, isso me parece ter a desvantagem de ser ainda menos testável; pelo menos format_bands poderia ter um teste de unidade para verificar se faz o que deveria, mas como testar o pipeline? Ou é a ideia de que as funções anônimas são tão auto-explicativas que não precisam ser testadas?
Meu aplicativo do mundo real para isso é tentar tornar meu pandas
código mais funcional. Muitas vezes terei algum tipo de pipeline dentro de uma função "munging"
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
Ou reescrevendo no estilo de pipeline:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
Alguma sugestão para as melhores práticas nesse tipo de situação?