Python是否有右侧管道函数操作符?如何实现类.pipe的链式处理?
问题:Python中实现类似
|>的管道操作符方案? 作为数据科学从业者,我在工作中常用pandas的.pipe方法实现链式数据处理:
# raw_data is a pandas dataframe data_clean = (data_raw .pipe(fill_nulls, **kwargs1) .pipe(add_feature_1, **kwargs2) .pipe(add_feature_2, **kwargs3) .pipe(add_feature_3, **kwargs4) .pipe(normalize_data, **kwargs5) )
但部分工具的对象未实现.pipe方法,只能用嵌套调用:
very_clean_data = func_4( func_3( func_2( func_1(data_clean, **kwargs1), **kwargs2), **kwargs3), **kwargs4)
或functools.reduce的变通方案:
import functools very_clean_data = functools.reduce(lambda x, f: f(x), [ data_clean, functools.partial(func_1, **kwargs1), functools.partial(func_2, **kwargs2), functools.partial(func_3, **kwargs3), functools.partial(func_4, **kwargs4) ] )
我希望Python有类似|>的管道操作符实现简洁链式处理,试过pipes库但不适用,且|操作符已大量用于字典合并和逻辑或。请问是否存在此类操作符或实现方案?
可行的实现方案
1. 自制极简管道工具函数
自己实现轻量的pipe函数,按顺序执行传入的函数:
def pipe(x, *funcs): for func in funcs: x = func(x) return x
结合functools.partial处理带参数的函数,用法如下:
from functools import partial very_clean_data = pipe( data_clean, partial(func_1, **kwargs1), partial(func_2, **kwargs2), partial(func_3, **kwargs3), partial(func_4, **kwargs4) )
2. 使用toolz库的pipe函数
第三方库toolz提供成熟的管道实现,专门用于函数式链式处理:
from toolz import pipe very_clean_data = pipe( data_clean, lambda x: func_1(x, **kwargs1), lambda x: func_2(x, **kwargs2), lambda x: func_3(x, **kwargs3), lambda x: func_4(x, **kwargs4) )
若函数支持位置参数,还可简化为:
very_clean_data = pipe( data_clean, func_1, kwargs1.get('arg1'), kwargs1.get('arg2'), func_2, kwargs2.get('arg1'), # ... 依此类推 )
3. 包装类重载|操作符
通过自定义包装类重载|操作符,模拟管道语法,避免修改内置类型:
class Pipeable: def __init__(self, value): self.value = value def __or__(self, func): return Pipeable(func(self.value)) def unwrap(self): return self.value # 使用示例 very_clean_data = ( Pipeable(data_clean) | partial(func_1, **kwargs1) | partial(func_2, **kwargs2) | partial(func_3, **kwargs3) | partial(func_4, **kwargs4) ).unwrap()
4. 分步赋值(最简可读性方案)
如果不想引入额外代码或依赖,直接分步赋值的可读性并不差:
x = data_clean x = func_1(x, **kwargs1) x = func_2(x, **kwargs2) x = func_3(x, **kwargs3) x = func_4(x, **kwargs4) very_clean_data = x
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

