Я подозреваю, что вам нужно кодировать JSON в формате HTML:
<input name="emails2bsent"
type="hidden"
value="<?php echo htmlspecialchars(json_encode($emails2bsent)); ?>">
Допустимый JSON может привести к неверному HTML, и браузер может опубликовать его неправильно.
Вы можете сериализовать байт-код функции и затем восстановить его на вызывающей стороне. Модуль marshal может использоваться для сериализации объектов кода, которые затем могут быть повторно собраны в функцию. т.е.:
import marshal
def foo(x): return x*x
code_string = marshal.dumps(foo.func_code)
Затем в удаленном процессе (после передачи code_string):
import marshal, types
code = marshal.loads(code_string)
func = types.FunctionType(code, globals(), "some_func_name")
func(10) # gives 100
Несколько предостережений:
формат маршала (любой байт-код python в этом отношении) может быть несовместим между основными версиями python.
Будет только работают для реализации cpython.
Если функция ссылается на глобальные объекты (включая импортированные модули, другие функции и т. д.), которые вам необходимо подобрать, вам также необходимо сериализовать их или воссоздать их на удаленной стороне. В моем примере просто указывается глобальное пространство имен удаленного процесса.
Возможно, вам потребуется сделать немного больше для поддержки более сложных случаев, такие как замыкания или функции генератора.
Можно сделать это:
def fn_generator():
def fn(x, y):
return x + y
return fn
Теперь, transmit(fn_generator())
отправит фактическое определение fn(x,y)
вместо ссылки на имя модуля.
можно использовать тот же прием для отправки классов через сеть.
Самый простой способ - это, вероятно, inspect.getsource (object)
(см. модуль проверки ), который возвращает строку с исходным кодом для функции или метода.
Все зависит от того, генерируете ли вы функцию во время выполнения или нет:
Если вы это сделаете - inspect.getsource (object)
не будет работать для динамически генерируемых функции, поскольку он получает источник объекта из файла .py
, поэтому только функции, определенные перед выполнением, могут быть извлечены в качестве источника.
И если ваши функции все равно помещаются в файлы, почему бы не предоставить доступ получателю к ним и передавать только имена модулей и функций.
Единственное решение для динамически создаваемых функций, которое я могу придумать, - это построить функцию в виде строки перед передачей, передать источник, а затем eval ()
ее на сторона приемника.
Изменить: решение marshal
выглядит также довольно умным, не знал, что вы можете сериализовать что-то другое, встроенное в
Основные функции, используемые в этом модуле, охватывают ваш запрос, плюс вы получаете наилучшее сжатие по сети; см. поучительный исходный код:
y_serial.py module :: хранилище объектов Python с SQLite
«Сериализация + постоянство :: в нескольких строках кода сжимайте и аннотируйте объекты Python в SQLite; затем извлекайте их в хронологическом порядке с помощью ключевые слова без SQL. Самый полезный "стандартный" модуль для базы данных для хранения данных без схемы. "