доступ к функциям уровня модуля в Python, если их имя хранится в переменной - PullRequest
1 голос
/ 25 февраля 2012

Каков наилучший способ использования функции в верхней части модуля, если заранее не известно имя объекта: функция может зависеть от ввода пользователя и, следовательно, ее имя сохраняется в переменной.

В одном решении используется eval () : например, в ScipyCookbook / SignalSmooth: smooth () (также упоминается в ответе на StackOverflow: Python Smooth Data Series Data)

import numpy  
window = 'hanning'
w = eval('numpy.'+window+'(11)')

будет эквивалентно

w = numpy.hanning(11)

Однако, есть ли лучший способ, чем использование хрупких / потенциально опасных eval?

Например, не будет ли предпочтительным использование vars ()

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

?Какие-нибудь лучшие / более питонские идеи?

Ответы [ 2 ]

4 голосов
/ 25 февраля 2012

Функции модуля являются атрибутами модуля, поэтому вы можете сделать:

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

vars() тоже хорошо.

4 голосов
/ 25 февраля 2012

Вам следует использовать словарь, сопоставляющий действительные имена оконных функций с действительными функциями:

windows = {"bartlett": numpy.bartlett,
           "blackman": numpy.blackman,
           "hamming": numpy.hamming,
           "hanning": numpy.hanning,
           "kaiser": numpy.kaiser}

Если вы используете eval(), пользователю в основном разрешено выполнять произвольный код.

Вариант

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

определенно лучше, чем использование eval(), но он все еще не гарантирует, что функция, выбранная пользователем, имеет смысл в данном контексте.(И обычно вместо этого вы используете getattr().)

...