9

我正在寻找一种更好的方法来调用基于 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)
...

我认为这将需要某种工厂函数,但不确定语法

4

8 回答 8

38

你可能会觉得getattr有用,我猜

import module
getattr(module, status.lower())(*args, **kwargs)
于 2009-03-25T10:08:32.407 回答
20

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

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

funcs = {
    'CONNECT': connect,
    'RAWFEED': rawfeed,
    'RAWCONFIG' : rawconfig,
    'TESTFEED': testfeed
}
funcs[status](*args, **kwargs)
于 2009-03-25T10:13:15.967 回答
15

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

import module
return getattr(module, status.lower()).__call__(*args, **kwargs)
于 2009-03-25T10:10:11.560 回答
5

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

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

或者如果函数像下面这样导入

from math import sin

sin 现在位于名称空间中,因此您可以通过以下方式调用它

vars()['sin'](1)
于 2009-03-25T10:18:46.360 回答
4

对 SilentGhost 的回答进行了一些改进:

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

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

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

于 2009-03-25T10:33:39.867 回答
3

看看这个:getattra 作为一个函数调度器

于 2009-03-25T10:19:41.880 回答
1

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

字典或 If 语句

希望这会有所帮助

伊夫

于 2009-03-25T10:27:10.630 回答
0

与上一个相比有一些变化:

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

func = funcs.get('status')
if func:
    func(*args, **kwargs)
于 2009-03-25T10:16:46.567 回答