Sie liest Mary Rose Cooks praktische Einführung in die funktionale Programmierung und gibt ein Beispiel für ein Anti-Pattern
def format_bands(bands):
for band in bands:
band['country'] = 'Canada'
band['name'] = band['name'].replace('.', '')
band['name'] = band['name'].title()
schon seit
- Die Funktion macht mehr als eine Sache
- Der Name ist nicht beschreibend
- es hat Nebenwirkungen
Als Lösungsvorschlag schlägt sie das Pipelining anonymer Funktionen vor
pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
call(lambda x: x.replace('.', ''), 'name'),
call(str.title, 'name')])
Dies scheint mir jedoch den Nachteil zu haben, noch weniger überprüfbar zu sein; Zumindest format_bands könnte einen Komponententest durchführen, um zu überprüfen, ob es das tut, was es soll, aber wie wird die Pipeline getestet? Oder ist die Idee, dass die anonymen Funktionen so selbsterklärend sind, dass sie nicht getestet werden müssen?
Meine reale Anwendung hierfür besteht darin, meinen pandas
Code funktionsfähiger zu machen . Ich habe oft eine Art Pipeline in einer "Munging" -Funktion "
def munge_data(df)
df['name'] = df['name'].str.lower()
df = df.drop_duplicates()
return df
Oder im Pipeline-Stil umschreiben:
def munge_data(df)
munged = (df.assign(lambda x: x['name'].str.lower()
.drop_duplicates())
return munged
Irgendwelche Vorschläge für Best Practices in solchen Situationen?