gpt4 book ai didi

Python - Pickle init 需要 4 个参数 - 给定 1 个

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:58 25 4
gpt4 key购买 nike

每当我尝试加载 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

我目前正在使用 Renpy,一个 pygame 框架。游戏加载并保存得很好,直到我加载了我编码的外部对象。加载该对象后,pickle 可以很好地保存游戏状态,但无法加载它,从而出现上述错误。

我知道没什么可继续的,但是这个错误超出了我的范围,我什至不知道问题代码可能在哪里。

最佳答案

您没有正确使用__reduce__。参见这里:https://docs.python.org/2/library/pickle.html#object.reduce 。对于类,您可以返回要传递给 __init__classargs 的元组。看到这里https://github.com/uqfoundation/mystic/blob/6bfbc46f9094f96deae020074d7bdad2a43d91d6/mystic/monitors.py#L298举个例子。您还可以使用 __setstate__ 方法来实现更复杂的类行为。

最小示例:

>>> 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)
>>>

但是,如果您有很多不可picklable的项目,通常最简单的方法是使用更好的序列化器,例如dill(请参见此处:https://github.com/uqfoundation/dill

关于Python - Pickle init 需要 4 个参数 - 给定 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com