Python动态函数名称

时间:2009-03-25 10:04:26

标签: python factory

我正在寻找一种更好的方法来调用基于Python中的变量的函数与使用if / else语句(如下所示)。每个状态代码都有相应的功能

if status == 'CONNECT':
    return connect(*args, **kwargs)
elif status == 'RAWFEED':
    return rawfeed(*args, **kwargs)
elif status == 'RAWCONFIG':
    return rawconfig(*args, **kwargs)
elif status == 'TESTFEED':
    return testfeed(*args, **kwargs)
...

我认为这需要某种工厂功能,但不确定语法

8 个答案:

答案 0 :(得分:39)

你可能会发现getattr有用,我想

import module
getattr(module, status.lower())(*args, **kwargs)

答案 1 :(得分:19)

执行此操作的规范方法是使用字典模拟switchif/elif。你可以在SO上找到几个类似问题的问题。

将您的函数放入字典中,并将状态代码作为键:

funcs = {
    'CONNECT': connect,
    'RAWFEED': rawfeed,
    'RAWCONFIG' : rawconfig,
    'TESTFEED': testfeed
}
funcs[status](*args, **kwargs)

答案 2 :(得分:15)

假设这些函数属于某个模块:

import module
return getattr(module, status.lower()).__call__(*args, **kwargs)

答案 3 :(得分:5)

它接缝你可以使用稍微不同的getattr(在我看来更优雅的方式)

import math
getattr(math, 'sin')(1)

或如果导入功能如下

from math import sin

sin现在位于命名空间中,因此您可以通过

调用它
vars()['sin'](1)

答案 4 :(得分:4)

对SilentGhost的回答有所改进:

globals()[status.lower()](*args, **kwargs)

如果要调用当前模块中定义的函数。

虽然看起来很难看。我会用字典解决方案。

答案 5 :(得分:3)

答案 6 :(得分:1)

我以前遇到过同样的问题。看看这个问题,我认为你正在寻找它。

Dictionary or If Statements

希望这是有帮助的

EEF

答案 7 :(得分:-1)

与前一个有所不同:

funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}

func = funcs.get('status')
if func:
    func(*args, **kwargs)