Как сериализовать пользовательскую функцию в Python - PullRequest
0 голосов
/ 30 января 2020

После прочтения я узнал, что pickle не может сериализовать функцию или класс в Python (по крайней мере, в версии 3.6 в windows). Но я также видел много людей, использующих dill для сериализации. Но когда я попробовал, я получил ошибки. Ниже приведен простой код, который я использовал:

import dill
def cube(x):
    x**x**x

with open('outfile', 'wb') as pickle_file:
    dill.dump(cube, pickle_file)

И вот ошибка, которую я получил:

py4j.protocol.Py4JError: An error occurred while calling o0.__getstate__. Trace:
py4j.Py4JException: Method __getstate__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:335)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:344)
    at py4j.Gateway.invoke(Gateway.java:279)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:209)
    at java.lang.Thread.run(Thread.java:748)

Чтобы подвести итог моей необходимости сериализации, я хочу использовать сериализацию, потому что я бы нравится использовать многопроцессорность (класс пула) в Python. После прочтения документации я go узнал, что класс пула выбирает объект для выполнения многопроцессорной обработки и как функцию или класс не может быть выбран, библиотека pathos.multiprocessing заявляет, что делает это, так как для сериализации использует укроп. Но когда я использовал его, он дал мне ошибку, о которой я упоминал в своем посте

Может ли кто-нибудь помочь мне выяснить проблему или сообщить, есть ли другой способ сериализации класса или функции в * 1017? *.

Заранее спасибо

1 Ответ

0 голосов
/ 30 января 2020

Два простых подхода к сериализации функции заключаются в сериализации ее имени и имени модуля-владельца для последующего использования import или dis дизассемблирования ее байт-кода.

Это звучит как XY вопрос :

... вы пытаетесь решить проблему X и думаете, что решение Y будет работать, но вместо того, чтобы спрашивать о X [вы спрашиваете о Y]

Не стесняйтесь задавать нам реальный вопрос, X. Должна быть цель более высокого уровня, которую вы пытаетесь достичь, сериализуя некоторое понятие «функции». Задайте новый вопрос, в котором вы покажете нам код, с которым работаете.

Кроме того, вычисление x ** x ** x - очень приятная функция, но она сильно отличается от вычислений x ** 3.

РЕДАКТИРОВАТЬ

Классифицированная c сложность с multiprocessing заключается в том, что вы столкнулись с объектом, который имеет атрибут «трудно сериализуемым», например, открытым TCP-соединением с БД. А затем вы создаете пул p и пытаетесь p.map( ... ), только чтобы вам сказали, что некоторые вещи нельзя сериализовать. Что ж, самое простое исправление состоит в том, чтобы вообще не создавать такие вещи, а не до p.map. Быть ленивым. Инициализируйте их после того, как p.map начнет выполнять ваш код в дочернем процессе. Тогда нет необходимости в маринаде или укропе, чтобы доставлять сумасшедшие вещи ребенку, поскольку ребенок может сам создавать такие вещи.

...