Al leer la Introducción práctica de Mary Rose Cook a la programación funcional , ella da como ejemplo un antipatrón
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
ya que
- la función hace más de una cosa
- el nombre no es descriptivo
- tiene efectos secundarios
Como solución propuesta, sugiere canalizar funciones anónimas
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
Sin embargo, esto me parece tener la desventaja de ser aún menos comprobable; al menos format_bands podría tener una prueba unitaria para verificar si hace lo que debe hacer, pero ¿cómo probar la tubería? ¿O es la idea de que las funciones anónimas son tan autoexplicativas que no necesitan ser probadas?
Mi aplicación en el mundo real para esto es tratar de hacer que mi pandascódigo sea más funcional. A menudo tendré algún tipo de tubería dentro de una función "munging"
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
O reescribiendo en el estilo de canalización:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
¿Alguna sugerencia para las mejores prácticas en este tipo de situación?