在Python中访问模块级函数(如果它们的名称存储在变量中)

在Python中访问模块级函数(如果它们的名称存储在变量中),python,module,eval,Python,Module,Eval,如果事先不知道对象的名称,那么在模块顶部使用函数的最佳方法是什么:函数可能取决于用户输入,因此其名称存储在变量中 一种解决方案使用:例如,in(也在对的回答中引用) 相当于 w = numpy.hanning(11) 但是,有没有比使用易碎/潜在危险的eval更好的方法 例如,你不会使用 优先考虑?有更好的/更多的Python思想吗?您应该使用字典将有效的窗口函数名映射到实际函数: windows = {"bartlett": numpy.bartlett, "black

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

一种解决方案使用:例如,in(也在对的回答中引用)

相当于

w = numpy.hanning(11)
但是,有没有比使用易碎/潜在危险的
eval
更好的方法

例如,你不会使用


优先考虑?有更好的/更多的Python思想吗?

您应该使用字典将有效的窗口函数名映射到实际函数:

windows = {"bartlett": numpy.bartlett,
           "blackman": numpy.blackman,
           "hamming": numpy.hamming,
           "hanning": numpy.hanning,
           "kaiser": numpy.kaiser}
如果使用
eval()
,用户基本上可以执行任意代码

变体

w = vars(numpy)[window](11)

肯定比使用
eval()
要好,但它仍然不能确保用户选择的函数在给定上下文中有意义。(通常,您会使用
getattr()
来代替它。)

您应该使用字典将有效的窗口函数名映射到实际函数:

windows = {"bartlett": numpy.bartlett,
           "blackman": numpy.blackman,
           "hamming": numpy.hamming,
           "hanning": numpy.hanning,
           "kaiser": numpy.kaiser}
如果使用
eval()
,用户基本上可以执行任意代码

变体

w = vars(numpy)[window](11)

肯定比使用
eval()
要好,但它仍然不能确保用户选择的函数在给定上下文中有意义。(通常,您会使用
getattr()
来代替它。)

模块的函数是模块的属性,因此您可以执行以下操作:

window = "hanning"
getattr(numpy, window)(11)

vars()
也很好。

模块的函数是模块的属性,因此您可以执行以下操作:

window = "hanning"
getattr(numpy, window)(11)

vars()。这也是我个人的方法+1.我真正喜欢的是在任何时候交换处理程序是多么容易管理。我认为getattr是一个更好的选择-它不需要重复您自己。如果需要更改处理程序,则不需要更改处理程序。@Lattyware:numpy模块包含近500个可调用对象。其中只有五个可用作窗口函数。使用
getattr()
将允许使用所有500个函数,其中大多数函数至少会导致程序中出现奇怪的行为。此外,我不认为这是“重复我自己”。我认为我们的程序的用户界面与NUMPY的API是脱钩的。我们将这些窗口函数在程序中应该具有的名称映射到NumPy中的函数对象——没有重复。@SvenMarnach很公平,在这种情况下,我同意这是更好的选择。我对numpy没有太多的经验,所以我把它当作一个普通案例来处理。你说得很好。我同意调度表通常是最安全的方法,最适合numpy示例。对于其他情况,我会记住
getattr()
。谢谢。比起其他方法,比如eval或getattr,我更喜欢这个方法。这也是我个人的方法+1.我真正喜欢的是在任何时候交换处理程序是多么容易管理。我认为getattr是一个更好的选择-它不需要重复您自己。如果需要更改处理程序,则不需要更改处理程序。@Lattyware:numpy模块包含近500个可调用对象。其中只有五个可用作窗口函数。使用
getattr()
将允许使用所有500个函数,其中大多数函数至少会导致程序中出现奇怪的行为。此外,我不认为这是“重复我自己”。我认为我们的程序的用户界面与NUMPY的API是脱钩的。我们将这些窗口函数在程序中应该具有的名称映射到NumPy中的函数对象——没有重复。@SvenMarnach很公平,在这种情况下,我同意这是更好的选择。我对numpy没有太多的经验,所以我把它当作一个普通案例来处理。你说得很好。我同意调度表通常是最安全的方法,最适合numpy示例。对于其他情况,我会记住
getattr()
。谢谢。另外,您可以使用getattr第三个参数来传递回退函数。此外,您还可以使用getattr第三个参数来传递回退函数。