我有几个小函数f1
,f2
,f3
和函数f
。
我希望f
成为f1
,f2
,f3
的“容器”:执行一些操作f1
,{{1 },f2
,具体取决于程序配置(例如f3
和f1
或f2
和f1
或全部三种),仅此而已。< / p>
我看到两个简单的解决方案:首先在函数f3
中添加一些if
:
f
第二,我可以在if configuration_f1_f2:
f1()
f2()
中添加操作列表:
f
并在for op in operations:
op()
中添加f1
,f2
,f3
或删除它们,具体取决于配置。
但我可以以某种方式构建动态的'f'代码,在operations
,f1
和f2
的调用中添加f3
,if
和list
,而不需要任何for
或f1
或f3
?我的意思是像快速代码操作。因此,如果我的配置为“f
和f1()
f3()
”,我会设置f2
代码,以便
f3
当我的配置更改为“f
和f2()
f3()
”时,我将{{1}}的代码修改为
{{1}}
我可以这样操作函数的代码吗?
答案 0 :(得分:3)
如果f1
,f2
等是带副作用的函数,则应使用明确的for
循环(没有花哨的map
解决方案)。也许你想要这样的东西?
configurations = {
'config_1': (f1, f2, f3),
'config_2': (f1, f2),
}
def f(config='config_1'):
for op in configurations[config]:
op()
如果f1
,f2
等接收参数,那么这可能是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()
这就是它的完成方式。没有“动态构建功能”