Python 调用X函数的函数
我想基本上把一个列表元素变成一个函数 do函数。这样,我只需使用 do(列表[x]) 我试图做的是一个函数,它去掉列表元素的引号,然后执行该列表元素中的函数Python 调用X函数的函数,python,Python,我想基本上把一个列表元素变成一个函数 do函数。这样,我只需使用 do(列表[x]) 我试图做的是一个函数,它去掉列表元素的引号,然后执行该列表元素中的函数 编辑: 我想做的是一个函数,它去掉了 元素,然后执行该列表中的函数 元素 嗯,它基本上是这样工作的。请注意,列表包含函数本身,而不是字符串 def func(): print "python" def func1(): print "is" def func2(): print "awesome" def d
编辑: 我想做的是一个函数,它去掉了 元素,然后执行该列表中的函数 元素
嗯,它基本上是这样工作的。请注意,列表包含函数本身,而不是字符串
def func():
print "python"
def func1():
print "is"
def func2():
print "awesome"
def do(fun):
fun()
funcs = [func, func1, func2]
for function in funcs:
do(function)
输出:
python
is
awesome
编辑:如果希望列表中包含函数名作为字符串,请使用eval()
:
您不需要额外的函数,也不需要将它们转换为字符串:
def func():
print "python"
def func1():
print "is"
def func2():
print "awesome"
funcs = [func, func1, func2]
for function in funcs:
function()
如果您确实希望从当前全局/模块范围内的名称列表中执行任意命名的函数,则可以执行以下操作:
NB:这不会使用潜在的不安全和危险的eval()
:
示例:
def func():
return "python"
def func1():
return "is"
def func2():
return "awesome"
def do(func_name, *args, **kwargs):
f = globals().get(func_name, lambda : None)
if callable(f):
return f(*args, **kwargs)
funs = ["func", "func1", "func2"]
print "".join(funs[0])
print "".join(map(do, funs))
$ python foo.py
func
pythonisawesome
输出:
def func():
return "python"
def func1():
return "is"
def func2():
return "awesome"
def do(func_name, *args, **kwargs):
f = globals().get(func_name, lambda : None)
if callable(f):
return f(*args, **kwargs)
funs = ["func", "func1", "func2"]
print "".join(funs[0])
print "".join(map(do, funs))
$ python foo.py
func
pythonisawesome
您还可以单独调用“命名”函数:
>>> do(funs[0])
python
注意
do()
的实现。这也可以更一般地应用于对象和其他模块,也可以调出globals()
查找。正如上面的人所说,最好的方法是定义函数字典,因为函数在python中是对象,这是可能的
def One():
pass
def Two():
pass
functions = {"ONE":One, "TWO":Two}
你可以这样称呼它:
functions[input]()
如果你想给用户真正的控制权(我不建议这样做),你可以使用eval函数
eval(input+"()")
为什么要将字符串而不是函数放入列表中?而
do(funs[x])
而不仅仅是funs[x]()
的意义是什么?因为我想稍后将它们转换为函数。如果我将它们作为函数保留,它们将全部运行(我不希望这样),然后变为无。如果您这样做,它们将不会运行,例如funs=[func,…]
(将函数放在列表中),而不是funs=[func(),…]
(将调用函数的结果放在列表中)。酷!,但是如果他们有参数会发生什么呢?你会怎么做?参数也需要存储吗?如果是,请查看lambda
或functools.partial
。如果没有,只要在调用函数时传递它们,就像使用函数名(funs[x](foo,bar)
)一样。不需要自定义的do
方法,只需使用python的apply
就可以了,根本不需要单独的函数<代码>函数()是你应该做的;我的回答是你的编辑(但没有使用eval()
):我永远不会提倡使用eval()
eval()
在这里真的很奇怪。即使是通过getattribute
查找方法也会更好。@JamesMills:eval偶尔也有很好的用途。99%的情况下,尤其是对于新手来说,eval
看起来很好的用途实际上是对高阶编程(如本例)或使用真实的数据格式和解析器的很好的用途,或者……但如果它真的是正确的,使用eval
肯定比使用与eval
相同的安全漏洞/调试问题/性能问题的笨拙解决方案要好……那么*args
有什么好处吗?我是说,你是在毫无争议的情况下说的。你能单独说吗?e、 g只是打印python?@CarlTheodooroposthumasolis:是的<代码>do(funs[0])