将函数设置为可能的函数池之一

时间:2015-02-27 08:02:14

标签: python decorator

问题:

在我的代码中,我想使用函数ff的作用取决于某些外部设置,称之为active_fun。如果设置为"f1",则f应该执行某些操作(即f1执行的操作),如果设置为"f2",则f应该执行f2做了什么。该函数的输入参数没有区别。一个简单的例子可以是这样的:

def f1(x):
    return x + 2

def f2(x):
    return x + 20

# somehow specify the "active" function
active_fun = "f1"

# do something to make sure, f is set to the "active" function 
for current_fun, fun in zip(["f1", "f2"], [f1, f2]):
    if current_fun == active_fun:
        f = fun
        break

# From here, only refer to f(), as it is the correct "active" fun
print f(2)

我觉得这可以用装饰器完成,但我不知道怎么做。对此提出任何建议都会非常有帮助。

我的替代方法:

我提出了一些替代方案。 1)当f的值发生变化时,始终更新active_fun的定义。

# alternative solution (1):
def f(x):
    for current_fun, fun in zip(["f1", "f2"], [f1, f2]):
        if current_fun == active_fun:
            return fun(x)

2)每当active_fun的值发生变化时,我都会运行一个函数,该函数返回f的正确定义:

# alternative solution (2):
def on_active_fun_change(active_fun):
     for current_fun, fun in zip(["f1", "f2"], [f1, f2]):
        if current_fun == active_fun:
            return fun

f = on_active_fun_change(active_fun)

我对他们中的任何一个都不满意,因为我认为pythonic的方式是用装饰器来做这件事。

有关用例的其他(非必要)信息:

我正在编写GUI,此GUI显示了一些图表。假设它可以做散射图或两个时间序列的线图。每次更改时,都会重绘绘图,因为将调用函数on_change。现在on_change应该知道它是在绘制散点图还是线图。

2 个答案:

答案 0 :(得分:1)

以下是一些选项:

func_map = {'f1': f1, 'f2': f2}
active_fun = 'f1'

选项1:

func_map[active_fun](3)
Out[86]: 5

选项2:

def map_func(x, active_func='f1'):
    return func_map[active_func](x)

map_func(3, 'f1')
Out[98]: 5

map_func(3, 'f2')
Out[99]: 23

答案 1 :(得分:1)

导入随机

def f1(x):     返回x + 2

def f2(x):     返回x + 20

funcs = [f1,f2] randFunc = random.choice(funcs)#从列表中选择一个随机函数 randFunc。的名称

输出:

In [8]: %paste
def f1(x):
    return x + 2

def f2(x):
    return x + 20


funcs = [f1, f2]
randFunc = random.choice(funcs)  # pick a random function from the list
randFunc.__name__

## -- End pasted text --
Out[8]: 'f1'

In [9]: randFunc(3)
Out[9]: 5