如果事先不知道对象的名称,在模块顶部使用函数的最佳方法是什么:函数可能依赖于用户输入,因此其名称存储在变量中。
一个解决方案使用eval():例如,在ScipyCookbook/SignalSmooth: smooth()中(也在StackOverflow: Python Smooth Time Series Data的答案中引用)
import numpy
window = 'hanning'
w = eval('numpy.'+window+'(11)')
将等同于
w = numpy.hanning(11)
但是,有没有比使用脆弱/潜在危险eval
更好的方法?
例如,不会使用vars()
w = vars(numpy)[window](11)
首选?有更好/更多的pythonic想法吗?
答案 0 :(得分:4)
您应该使用将有效窗口函数名称映射到实际函数的字典:
windows = {"bartlett": numpy.bartlett,
"blackman": numpy.blackman,
"hamming": numpy.hamming,
"hanning": numpy.hanning,
"kaiser": numpy.kaiser}
如果您使用eval()
,则基本上允许用户执行任意代码。
变体
w = vars(numpy)[window](11)
肯定比使用eval()
更好,但它仍然无法确保用户选择的函数在给定的上下文中有意义。 (通常,你会使用getattr()
代替。)
答案 1 :(得分:4)
模块的功能是模块的属性,因此您可以这样做:
window = "hanning"
getattr(numpy, window)(11)
vars()
也没关系。