2011-03-22 52 views
7

我需要做的是循环大量不同的文件并(尝试)从文件中获取元数据。在Python中通过变量名执行函数

我可以做一个大的if ... elif ...并测试每个扩展,但我认为将扩展存储在变量中会更容易,检查是否存在具有该名称的函数,并执行它。

这是我目前的解决方案,从另一个计算器线程采取:

try: 
    getattr(modulename, funcname)(arg) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 

没有与此问题: 如果底层函数产生一个AttributeError,这个被注册为“功能未找到”错误。 我可以加试...除了块的所有功能,但不会特别漂亮要么...

我正在寻找的是更多的类似:

if function_exists(fun): 
    execute_function(fun, arg) 

是否有直接的方式做到这一点?

感谢:-)

回答

22

你可以这样做:

func = getattr(modulename, funcname, None): 
if func: 
    func(arg) 

或许更好:

try: 
    func = getattr(modulename, funcname) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else: 
    func(arg) 
+1

我包'FUNC(ARG)':

要使用这个变量里面'和catch类型错误的情况下,该模块有一个属性'func'不是调用。 – geoffspear 2011-03-22 12:37:42

+0

@Wooble:不错的建议或者他也可以这样做:'if func and callable(func):' – mouad 2011-03-22 12:40:15

+0

@Carpetsmoker:很高兴帮助:) – mouad 2011-03-22 12:59:02

3

gettattr function有一个默认值返回,如果属性不存在,所以你可以使用一个可选的第三个参数:

fun = getattr(modulename, funcname, None) 

if fun is None: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else 
    fun(arg) 
0

就像@mouad所说的,callable(function)可以调用一个函数。

你可以用它来使用这个变量里面调用一个函数:

callable(SAVE()) 

这将调用被指定为ARG的功能。在`尝试

Save = callable(SAVE())