在阅读Mary Rose Cook的《函数式编程实用入门》时,她以反模式为例。
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
代码更具功能性。我经常会在“ munging”函数中使用某种管道”
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
对于这种情况下的最佳做法有何建议?