def x():
print("x called")
fname="x"
globals()[fname]()
Ответ со словарем (выше) хороший. А еще есть встроенный словарь символов, который выдает globals().
И eval() - тоже вариант. Но если fname у вас идет из ненадежного источника (пользователя) - то это опасно (через globals() - тоже опасно). Например:
globals()['os'].system("clear")
Вызовет
clear
, а может вызвать и
rm -rf /
.
Если нужен безопасный eval - советую посмотреть на
evalidate (disclaimer: этой мой пакет), и там по ссылкам еще альтернативы есть -
asteval и
simleeval. Через них можно (если аккуратно) сделать безопасный eval и проверить его популярным джейлбрейками (в evalidate они есть, и есть в тестах к нему).