Если вы принимаете ввод от пользователя, в целях безопасности, вероятно, лучше всего
используйте ручной диктовку, которая будет принимать только четко определенный набор допустимых пользовательских данных:
unpack_options = { 'unpack_pdb_line' : unpack_pdb_line,
'unpack_pdb_line2' : unpack_pdb_line2,
}
Пренебрегая безопасностью на мгновение, давайте мимоходом отметим, что легкий способ
перейти от (строки имен переменных) к (значение, на которое ссылается имя переменной)
это использовать встроенный в глобальный ()) dict:
unpack_function=globals()['unpack_pdb_line']
Конечно, это будет работать, только если переменная unpack_pdb_line
находится в глобальном пространстве имен.
Если вам нужен пакет для модуля или модуля для переменной, то
Вы могли бы использовать эту функцию
import sys
def str_to_obj(astr):
print('processing %s'%astr)
try:
return globals()[astr]
except KeyError:
try:
__import__(astr)
mod=sys.modules[astr]
return mod
except ImportError:
module,_,basename=astr.rpartition('.')
if module:
mod=str_to_obj(module)
return getattr(mod,basename)
else:
raise
Вы можете использовать это так:
str_to_obj('scipy.stats')
# <module 'scipy.stats' from '/usr/lib/python2.6/dist-packages/scipy/stats/__init__.pyc'>
str_to_obj('scipy.stats.stats')
# <module 'scipy.stats.stats' from '/usr/lib/python2.6/dist-packages/scipy/stats/stats.pyc'>
str_to_obj('scipy.stats.stats.chisquare')
# <function chisquare at 0xa806844>
Работает для вложенных пакетов, модулей, функций или (глобальных) переменных.