python动态构建函数

时间:2009-10-20 09:59:00

标签: python

我有几个小函数f1f2f3和函数f

我希望f成为f1f2f3的“容器”:执行一些操作f1,{{1 },f2,具体取决于程序配置(例如f3f1f2f1或全部三种),仅此而已。< / p>

我看到两个简单的解决方案:首先在函数f3中添加一些if

f

第二,我可以在if configuration_f1_f2: f1() f2() 中添加操作列表:

f

并在for op in operations: op() 中添加f1f2f3或删除它们,具体取决于配置。

但我可以以某种方式构建动态的'f'代码,在operationsf1f2的调用中添加f3iflist,而不需要任何forf1f3?我的意思是像快速代码操作。因此,如果我的配置为“ff1() f3() ”,我会设置f2代码,以便

f3

当我的配置更改为“ff2() f3() ”时,我将{{1}}的代码修改为

{{1}}

我可以这样操作函数的代码吗?

5 个答案:

答案 0 :(得分:3)

如果f1f2等是带副作用的函数,则应使用明确的for循环(没有花哨的map解决方案)。也许你想要这样的东西?

configurations = {
  'config_1': (f1, f2, f3),
  'config_2': (f1, f2),
}

def f(config='config_1'):
    for op in configurations[config]:
        op()

如果f1f2等接收参数,那么这可能是f更合适的定义:

def f(config, *args, **kwargs):
    for op in configurations[config]:
        op(*args, **kwargs)

答案 1 :(得分:3)

如果你很勇敢,可以将函数定义构造为字符串并将其传递给exec语句。例如:

func = "def f():\n"
if config_f1:
    func += " f1()\n"
if config_f2:
    func += " f2()\n"
exec func in globals()

此时,您应该有一个新的全局f()来执行相应的代码位。

答案 2 :(得分:1)

创建字典

fun_dict = {'f1': f1, 'f2': f2}

然后解析你的配置并从dict运行函数:

fun_dict[parsed_name]()

答案 3 :(得分:1)

可以通过各种方式实现您的目标,但为此您需要完全定义问题和上下文

一种方式可能是这样的,其他大部分将是变体,使用dict查找我们需要的函数

def f1(): print "f1"
def f2(): print "f2"
def f3(): print "f3"

def f(fList):
    for f in fList: globals()[f]()

f(["f1", "f2"])
f("f1 f3 f1 f3 f2 f1 f3 f2".split())

答案 4 :(得分:1)

使用对象和命令设计模式。

class Function( object ):
    pass

class F1( Function ):
    def __call__( self ):
        whatever `f1` used to do

 class F2( Function ):
    def __call__( self ):
        whatever `f1` used to do

 class Sequence( Function ):
     def __init__( self, *someList ):
         self.sequence= someList
     def __call__( self ):
         for f in self.sequence:
             f()

f= myDynamicOperation( F1(), F2(), F3() )
f()

这就是它的完成方式。没有“动态构建功能”