Python动态函数名称

drj*_*eep 9 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)
...
Run Code Online (Sandbox Code Playgroud)

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

Sil*_*ost 39

getattr我想你可能觉得很有用

import module
getattr(module, status.lower())(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 它适用于任何对象.模块也是对象. (3认同)

小智 19

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

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

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

  • 这不是函数调度的规范pythonic方式.getattr是这种情况下的规范方法 (6认同)

var*_*tec 15

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

import module
return getattr(module, status.lower()).__call__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

import math
getattr(math, 'sin')(1)
Run Code Online (Sandbox Code Playgroud)

或者如果导入功能如下所示

from math import sin
Run Code Online (Sandbox Code Playgroud)

sin现在在命名空间中,所以你可以调用它

vars()['sin'](1)
Run Code Online (Sandbox Code Playgroud)