Существует ли простой способ засолить функцию Python (или иначе сериализировать ее код)?

Я подозреваю, что вам нужно кодировать JSON в формате HTML:

<input name="emails2bsent"
       type="hidden"
       value="<?php echo htmlspecialchars(json_encode($emails2bsent)); ?>">

Допустимый JSON может привести к неверному HTML, и браузер может опубликовать его неправильно.

90
задан Manav Kataria 15 November 2016 в 00:04
поделиться

6 ответов

Вы можете сериализовать байт-код функции и затем восстановить его на вызывающей стороне. Модуль 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.

  • Если функция ссылается на глобальные объекты (включая импортированные модули, другие функции и т. д.), которые вам необходимо подобрать, вам также необходимо сериализовать их или воссоздать их на удаленной стороне. В моем примере просто указывается глобальное пространство имен удаленного процесса.

  • Возможно, вам потребуется сделать немного больше для поддержки более сложных случаев, такие как замыкания или функции генератора.

114
ответ дан 24 November 2019 в 07:02
поделиться

Можно сделать это:

def fn_generator():
    def fn(x, y):
        return x + y
    return fn

Теперь, transmit(fn_generator()) отправит фактическое определение fn(x,y) вместо ссылки на имя модуля.

можно использовать тот же прием для отправки классов через сеть.

0
ответ дан 24 November 2019 в 07:02
поделиться
14
ответ дан 24 November 2019 в 07:02
поделиться

Самый простой способ - это, вероятно, inspect.getsource (object) (см. модуль проверки ), который возвращает строку с исходным кодом для функции или метода.

10
ответ дан 24 November 2019 в 07:02
поделиться

Все зависит от того, генерируете ли вы функцию во время выполнения или нет:

Если вы это сделаете - inspect.getsource (object) не будет работать для динамически генерируемых функции, поскольку он получает источник объекта из файла .py , поэтому только функции, определенные перед выполнением, могут быть извлечены в качестве источника.

И если ваши функции все равно помещаются в файлы, почему бы не предоставить доступ получателю к ним и передавать только имена модулей и функций.

Единственное решение для динамически создаваемых функций, которое я могу придумать, - это построить функцию в виде строки перед передачей, передать источник, а затем eval () ее на сторона приемника.

Изменить: решение marshal выглядит также довольно умным, не знал, что вы можете сериализовать что-то другое, встроенное в

6
ответ дан 24 November 2019 в 07:02
поделиться

Основные функции, используемые в этом модуле, охватывают ваш запрос, плюс вы получаете наилучшее сжатие по сети; см. поучительный исходный код:

y_serial.py module :: хранилище объектов Python с SQLite

«Сериализация + постоянство :: в нескольких строках кода сжимайте и аннотируйте объекты Python в SQLite; затем извлекайте их в хронологическом порядке с помощью ключевые слова без SQL. Самый полезный "стандартный" модуль для базы данных для хранения данных без схемы. "

http://yserial.sourceforge.net

1
ответ дан 24 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: