Следующие работы:
def spam():
print "spam"
exec(spam.__code__)
спам
Но что, если spam
принимает аргументы?
def spam(eggs):
print "spam and", eggs
exec(spam.__code__)
TypeError: spam() принимает ровно 1 аргумент (задано 0)
Учитывая, что у меня нет доступа к самой функции, но только к объекту кода, как я могу передать аргументы объекту кода при его выполнении? Возможно ли это с помощью eval?
Изменить: поскольку большинство читателей склонны не верить в полезность этого, см. следующий прецедент:
Я хочу сохранить небольшие функции Python в файл, чтобы их можно было вызвать, например. с другого компьютера. (Излишне говорить здесь, что этот usecase строго ограничивает возможные функции.) Расселение самого объекта функции не может работать, потому что это только сохраняет имя и модуль, где определена функция. Вместо этого я мог бы выбрать __code__
функции. Когда я снова распечатаю его, конечно, ссылка на функцию исчезла, поэтому я не могу назвать функцию. Я просто не имею его во время выполнения.
Еще одна утилита:
Я работаю над несколькими функциями в одном файле, которые вычисляют некоторые данные и хранят их на жестком диске. Расчеты потребляют много времени, поэтому я не хочу выполнять функции каждый раз, но только тогда, когда реализация функции изменилась.
У меня есть версия этого запуска для целого модуля вместо функции. Он работает, просматривая время модификации файла, в котором реализован модуль. Но это не вариант, если у меня есть много функций, которые я не хочу разделять в отдельных файлах.