Python dynamic function names

百般思念 提交于 2019-12-18 11:57:29

问题


I'm looking for a better way to call functions based on a variable in Python vs using if/else statements like below. Each status code has a corresponding function

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)
...

I assume this will require some sort of factory function but unsure as to the syntax


回答1:


The canonical way to do this is to use a dictionary to emulate switch or if/elif. You will find several questions to similar problems here on SO.

Put your functions into a dictionary with your status codes as keys:

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



回答2:


you might find getattr useful, I guess

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



回答3:


assuming that these functions belong to some module:

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



回答4:


it seams that you can use getattr in a slightly different (in my opinion more elegant way)

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

or if function is imported like below

from math import sin

sin is now in namespace so you can call it by

vars()['sin'](1)



回答5:


Some improvement to SilentGhost's answer:

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

if you want to call the function defined in the current module.

Though it looks ugly. I'd use the solution with dictionary.




回答6:


Look at this: getattra as a function dispatcher




回答7:


I encountered the same problem previously. Have a look at this question, I think its what you are looking for.

Dictionary or If Statements

Hope this is helpful

Eef




回答8:


some change from previous one:

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

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


来源:https://stackoverflow.com/questions/680941/python-dynamic-function-names

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!