如何在Python中序列化用户定义的函数

如何在Python中序列化用户定义的函数,python,python-3.x,serialization,pickle,dill,Python,Python 3.x,Serialization,Pickle,Dill,读了很多书之后,我知道pickle不能在Python中序列化函数或类(至少在windows的3.6版本中)。但是我也看到很多人使用dill进行序列化。但当我尝试时,我犯了错误。下面是我使用的简单代码: import dill def cube(x): x**x**x with open('outfile', 'wb') as pickle_file: dill.dump(cube, pickle_file) 这就是我得到的错误: py4j.protocol.Py4JError

读了很多书之后,我知道pickle不能在Python中序列化函数或类(至少在windows的3.6版本中)。但是我也看到很多人使用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中使用多处理(池类)。阅读文档后,我知道pool类会对对象进行pickle以执行多处理,而作为函数或类不能被pickle,pathos.multiprocessing库声称这样做是因为它使用dill进行序列化。但是当我使用它时,它给了我我在帖子中提到的错误

有人能帮我找出问题所在,或者告诉我是否有其他方法可以用Python序列化类或函数


提前感谢两种简单的函数序列化方法 将序列化其名称和拥有的模块名称, 对于
导入的后续使用
, 或者对其字节码进行反汇编

这听起来像是一个:

。。。你试图解决问题X,你认为解决方案Y可行,但不是问X[你问Y]

请随便问我们真正的问题,X。 你一定有更高层次的目标 试图通过序列化一些概念来满足 “函数”的定义。 问一个新问题, 在其中,您向我们展示了正在使用的代码

另外,计算
x**x**x
是一个非常好的函数, 但它与计算
x**3
大不相同

编辑

多处理的一个典型困难是
最终得到的对象具有“难以序列化”的特性
属性,例如与数据库的开放TCP连接。
然后创建一个池
p
并尝试
p.map(…)
, 只是被告知某些东西无法序列化。 嗯,最简单的解决办法是避免制造这样的东西 首先,不是在
p.map
之前。 懒惰。在
p.map
启动后初始化它们 在子进程中执行代码。 那么就没有必要用腌菜或莳萝来装运了 疯狂的事情对孩子来说,自从孩子
你可以自己构造这样的东西。

你有例子来说明吗?谢谢你为什么会有一个充满
py4j
消息的错误?您显示的代码根本没有使用Py4j。什么使你认为函数和类不能在Windows上被pickle?函数和类可以被pickle。如果取消勾选数据的代码首先导入了勾选数据的代码所使用的所有模块和类,那么它应该能够正确地重建所有类实例。但这可能是一个与您的
Py4JError
完全不同的问题。不管导入情况如何,我都不会期望酸洗过程崩溃。确保包含运行示例所需的所有导入,但不包括实际运行示例所不需要的导入。如果从py4j导入导致了问题,那么向py4j维护人员报告这似乎是一个bug。