在我的代码中,我想使用函数f
。 f
的作用取决于某些外部设置,称之为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
应该知道它是在绘制散点图还是线图。
答案 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