【问题标题】:Join list of function names into a series of nested function calls将函数名称列表加入一系列嵌套函数调用
【发布时间】:2021-09-08 19:37:38
【问题描述】:

我有一个函数名称列表 functions 存储为一个字符串,我想将其嵌套在一起以创建一个应用于某些输入字符串 var 的表达式:

f1,f2,f3

最终结果将是这个字符串:

f1(f2(f3({var})))

我该怎么做呢?我有这个给我想要的东西,想知道它是否可以改进?

functions = 'f1,f2,f3'
var = 'hello'
all_functions = functions.split(',')
'('.join(all_functions) + '(' + var + ')'*len(all_functions)

结果

f1(f2(f3(hello)))

【问题讨论】:

    标签: python python-3.x string


    【解决方案1】:

    这是一个递归解决方案:

    def nest(*args):
        if len(args) == 1:
            return args[0]
        return f"{args[0]}({nest(*args[1:])})"
    

    例子:

    >>> functions = "f1,f2,f3"
    >>> var = "hello"
    >>> nest(*functions.split(","), var)
    'f1(f2(f3(hello)))'
    

    【讨论】:

      【解决方案2】:

      不用拆分,省你一行:

      functions.replace(',', '(') + '(' + var + ')' * (functions.count(',') + 1)
      

      您还可以使用字符串格式,例如,确保var 正确转换为字符串:

      f'{functions.replace(",", "(")}({var}){")" * functions.count(",")}'
      

      【讨论】:

        【解决方案3】:

        functools.reduce的方式:

        reduce('{1}({0})'.format, functions.split(',')[::-1], var)
        

        【讨论】:

          【解决方案4】:

          带有参数解包的递归函数可以优雅地做到这一点:

          def call(func,*params): 
              return f"{func}({call(*params)})" if params else func
          
          functions = 'f1,f2,f3'
          var = 'hello'
          
          print(call(*functions.split(","),var))
          
          f1(f2(f3(hello)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-19
            • 2021-11-03
            • 1970-01-01
            • 2021-07-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多