如果名称存储在变量中,则访问Python中的模块级函数

时间:2012-02-25 17:45:39

标签: python module eval

如果事先不知道对象的名称,在模块顶部使用函数的最佳方法是什么:函数可能依赖于用户输入,因此其名称存储在变量中。

一个解决方案使用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想法吗?

2 个答案:

答案 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()也没关系。