exec
не возвращает значение; вместо этого он оценивает некоторый код в текущем контексте (по умолчанию) или в пользовательском контексте. Под «контекстом» я подразумеваю диктаты местных жителей и глобалов.
Похоже, вы хотите следующее:
a = { }
exec "def u(string): return unicode(string, 'utf-8')" in { }, a
# a now contains method by name 'u', just like your original example
a['u']('cheese') # -> u'cheese'
Это работает, выполняя строку кода с временным диктом ({ }
) для хранения сгенерированных глобальных переменных и a
для хранения локальных. См. документы для получения дополнительной информации.
Вы можете использовать eval()
, если вам нужно оценить значение блока кода (хотя вы не можете eval()
объявление метода).
Обратите внимание, что unicode
должен иметь строчную букву U.