当前位置:  开发笔记 > 编程语言 > 正文

Python动态函数名称

如何解决《Python动态函数名称》经验,为你挑选了4个好方法。

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

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



1> SilentGhost..:

getattr我想你可能觉得很有用

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


它适用于任何对象.模块也是对象.

2> 小智..:

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

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

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


这不是函数调度的规范pythonic方式.getattr是这种情况下的规范方法

3> vartec..:

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

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



4> 小智..:

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

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

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

from math import sin

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

vars()['sin'](1)

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有