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