【问题标题】:Python chain several functions into onePython将几个函数合二为一
【发布时间】:2022-06-27 21:26:43
【问题描述】:

我有几个字符串处理函数,例如:

def func1(s):
    return re.sub(r'\s', "", s)

def func2(s):
    return f"[{s}]"
...

我想将它们组合成一个管道函数:my_pipeline(),以便我可以将其用作参数,例如:

class Record:
    def __init__(self, s):
        self.name = s
    
    def apply_func(self, func):
        return func(self.name)

rec = Record(" hell o")
output = rec.apply_func(my_pipeline)
# output = "[hello]"

目标是使用my_pipeline作为参数,否则需要一一调用这些函数。

谢谢。

【问题讨论】:

    标签: python function pipeline chain


    【解决方案1】:

    您可以编写一个简单的工厂函数或类来构建管道函数:

    >>> def pipeline(*functions):
    ...     def _pipeline(arg):
    ...         result = arg
    ...         for func in functions:
    ...             result = func(result)
    ...         return result
    ...     return _pipeline
    ...
    >>> rec = Record(" hell o")
    >>> rec.apply_func(pipeline(func1, func2))
    '[hello]'
    

    这是参考this使用functools.reduce编写的更精致的版本:

    >>> from functools import reduce
    >>> def pipeline(*functions):
    ...     return lambda initial: reduce(lambda arg, func: func(arg), functions, initial)
    

    我没有测试过,但是根据我的直觉,每个循环都会在python级别多调用一次函数,所以性能可能不如循环实现。

    【讨论】:

      【解决方案2】:

      您可以创建一个调用这些函数的函数:

      def my_pipeline(s):
          return func1(func2(s))
      

      【讨论】:

      • 谢谢!此解决方案适用于这种特定情况,但结合多种不同功能的解决方案会更合适。
      【解决方案3】:

      使用函数列表(这样你就可以在别处组装它们):

      def func1(s):
          return re.sub(r'\s', "", s)
      
      def func2(s):
          return f"[{s}]"
      
      def func3(s):
          return s + 'tada '
      
      def callfuncs(s, pipeline):
          f0 = s
          pipeline.reverse()
          for f in pipeline:
              f0 = f(f0)        
          return f0
      
      class Record:
          def __init__(self, s):
              self.name = s
      
          def apply_func(self, pipeline):
              return callfuncs(s.name, pipeline)
              
      # calling order func1(func2(func3(s)))
      my_pipeline = [func1, func2, func3]
      rec = Record(" hell o")
      output = rec.apply_func(my_pipeline)
      

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多