如果事先不知道对象的名称,在模块顶部使用函数的最佳方法是什么:该函数可能取决于用户输入,因此它的名称存储在变量中。
一种解决方案使用 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 的想法吗?
请您参考如下方法:
您应该使用字典将有效的窗口函数名称映射到实际函数:
windows = {"bartlett": numpy.bartlett,
"blackman": numpy.blackman,
"hamming": numpy.hamming,
"hanning": numpy.hanning,
"kaiser": numpy.kaiser}
如果你使用eval(),基本上允许用户执行任意代码。
变体
w = vars(numpy)[window](11)
肯定比使用 eval() 好,但它仍然不能确保用户选择的函数在给定的上下文中有意义。 (通常,您会为此使用 getattr()。)
