メアリーローズクックの「関数型プログラミング入門」を読んで、アンチパターンの例として
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
このような状況でのベストプラクティスに関する提案はありますか?