Python-Pickle init接受4个参数-1

Python-Pickle init接受4个参数-1,python,save,pygame,pickle,renpy,Python,Save,Pygame,Pickle,Renpy,无论何时尝试加载pickle对象,都会出现以下错误: I'm sorry, but an uncaught exception occurred. While running game code: File "renpy/common/00action_file.rpy", line 328, in __call__ renpy.load(fn) TypeError: __init__() takes exactly 4 arguments (1 given) -- Full

无论何时尝试加载pickle对象,都会出现以下错误:

I'm sorry, but an uncaught exception occurred.

While running game code:
  File "renpy/common/00action_file.rpy", line 328, in __call__
    renpy.load(fn)
TypeError: __init__() takes exactly 4 arguments (1 given)

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "renpy/common/_layout/screen_main_menu.rpym", line 29, in script
    $ ui.interact()
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/ast.py", line 785, in execute
    renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/python.py", line 1382, in py_exec_bytecode
    exec bytecode in globals, locals
  File "renpy/common/_layout/screen_main_menu.rpym", line 29, in <module>
    $ ui.interact()
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/ui.py", line 247, in interact
    rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/core.py", line 2149, in interact
    repeat, rv = self.interact_core(preloads=preloads, **kwargs)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/core.py", line 2750, in interact_core
    rv = root_widget.event(ev, x, y, 0)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/screen.py", line 626, in event
    rv = self.child.event(ev, x, y, st)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/layout.py", line 846, in event
    rv = i.event(ev, x - xo, y - yo, cst)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/behavior.py", line 762, in event
    return handle_click(self.clicked)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/behavior.py", line 705, in handle_click
    rv = run(action)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/display/behavior.py", line 274, in run
    return var(*args, **kwargs)
  File "renpy/common/00action_file.rpy", line 328, in __call__
    renpy.load(fn)
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/loadsave.py", line 573, in load
    roots, log = loads(location.load(filename))
  File "/home/digiholic/workspace/SummonerSweetheart-0.9-all/renpy/loadsave.py", line 51, in loads
    return pickle.loads(s)
  File "/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py", line 1382, in loads
  File "/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py", line 858, in load
  File "/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py", line 1133, in load_reduce
TypeError: __init__() takes exactly 4 arguments (1 given)

Linux-3.11.0-26-generic-x86_64-with-debian-wheezy-sid
Ren'Py 6.18.3.761
Summoner Sweetheart 0.9
很抱歉,发生了一个意外的异常。
运行游戏代码时:
调用中第328行的文件“renpy/common/00action\u File.rpy”__
雷诺荷载(fn)
TypeError:\uuuu init\uuuuuu()正好接受4个参数(给定1个)
--完全回溯------------------------------------------------------------
完全回溯:
脚本第29行的文件“renpy/common/_layout/screen_main_menu.rpym”
$ui.interact()
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/ast.py”,执行中第785行
renpy.python.py_exec_字节码(self.code.bytecode,self.hide,store=self.store)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/python.py”,第1382行,采用py_exec_字节码
全局、局部中的exec字节码
文件“renpy/common/_layout/screen_main_menu.rpym”,第29行,在
$ui.interact()
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/ui.py”,第247行,在interact中
rv=renpy.game.interface.interactive(向前滚=向前滚,**kwargs)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/core.py”,第2149行,在interact中
重复,rv=自堆芯(预载=预载,**kwargs)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/core.py”,第2750行,在interact_core中
rv=根控件事件(ev、x、y、0)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/screen.py”,第626行,在事件中
rv=自身子事件(ev、x、y、st)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/layout.py”,第846行,在事件中
rv=i.事件(ev,x-xo,y-yo,cst)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/behavior.py”,第762行,在事件中
返回句柄单击(自单击)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/behavior.py”,第705行,在句柄中单击
rv=运行(动作)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/display/behavior.py”,第274行,运行中
返回变量(*args,**kwargs)
调用中第328行的文件“renpy/common/00action\u File.rpy”__
雷诺荷载(fn)
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/loadsave.py”,第573行,装入
根,log=load(location.load(filename))
文件“/home/digiholic/workspace/callersweetheart-0.9-all/renpy/loadsave.py”,第51行,在loads中
返回酸洗。装载(个)
文件“/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py”,第1382行,装入
文件“/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py”,第858行,已加载
文件“/home/tom/ab/x64lucid-deps/install/lib/python2.7/pickle.py”,第1133行,在load\u中
TypeError:\uuuu init\uuuuuu()正好接受4个参数(给定1个)
Linux-3.11.0-26-generic-x86_64-with-debian-wheezy-sid
雷恩比6.18.3.761
召唤者甜心0.9
我目前正在使用Renpy,一个pygame框架。游戏可以很好地加载和保存,直到我到达加载我编码的外部对象的点。加载该对象后,pickle会很好地保存游戏状态,但无法加载,这给了我上面的错误


我知道没有太多的事情要做,但是这个错误太离谱了,我甚至不知道问题代码可能在哪里。

您没有正确使用
\uuu reduce\uu
。请参见此处:。对于类,您可以返回要传递给
\uuuu init\uuuu
类和
参数的元组。请参见这里的示例。对于类的更复杂行为,还可以使用
\uuuu setstate\uuu
方法

最简单的例子:

>>> class Foo(object):
...   def __init__(self, x, y, z):
...     self.x = x
...     self.y = y
...     self.z = z
...   def __reduce__(self):
...     return (self.__class__, (self.x, self.y, self.z))
...   f = lambda x:x
... 
>>> f = Foo(1,2,3)
>>> 
>>> import pickle
>>> _f = pickle.loads(pickle.dumps(f))
>>> _f.x, _f.y, _f.z
(1, 2, 3)
>>> 

但是,如果有很多不可拼接的项,通常最简单的方法是使用更好的序列化程序,如
dill
(请参见此处:。

我也遇到了同样的问题。问题在于python中字节对象的工作方式

我不知道真正的问题是从哪里来的,但是如果您自己将pickle对象打印为字节字符串(
b'blahblah'
),并将其直接发送给
pickle.loads(b'blahblah')
,您将得到相同的错误

有些对象似乎无法以这种方式工作,它们无法序列化、保存,然后在以后再次反序列化(可能是因为它们的依赖关系或其他原因)

对于那些想使用pickle来转储对象的人,我的建议是不要使用它。
这不值得你花时间

  • 只需保存必要的属性,然后使用构造函数从这些值重新创建该对象
  • 或者,您可以使用
    ORM
    工具为您管理此功能

  • 希望这能节省一些时间。

    在load.reduce()中,您必须创建一个新对象,并且没有为它提供足够的参数。load.reduce()在哪里找到了吗?你能发布引发错误的代码吗?回溯中的代码都是外部库,没有一个是我自己编写的代码。我不知道我编写的代码中的哪个对象导致了错误,而且有太多的对象无法全部发布。有没有办法找出哪个对象的init方法引发了错误?我减少了我定义的每一个类仍然会得到一个相同的错误。有吗