马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
昨天给之前的养成游戏框架增加了换装的新代码,但是每次按重新加载的时候就会报一个错误。如下
TypeError [color=var(--black-700)]Cannot pickle 'dict_keys' object
看到错误先去搜索了错误信息,获得了一堆python相关的。
但是我没有仔细去看,我存了新加的代码,并用版本管理工具恢复到了上个版本,果然重新加载不会再出错了。
然后我打算一步一步去对比到底新加的代码哪里出了问题。
在这期间,我发现老版本不出错的原因是因为,老版本刚开始游戏的时候是在家里,但是到了商店就会出错。
并且存档的时候也会报这个错误。
我又看了几个之前也用一样框架的,都有这个问题。
也就是说之前那个商店的也有这个问题。
到这里debug卡住了,不知道该如何继续。
我觉得可能是和renpy相关的,加上renpy关键字,再次搜索这个错误信息。
发现了几个相关的帖子:
https://lemmasoft.renai.us/forums/viewtopic.php?t=42496
https://lemmasoft.renai.us/forums/viewtopic.php?t=45672
https://lemmasoft.renai.us/forums/viewtopic.php?t=15606
https://lemmasoft.renai.us/forums/viewtopic.php?t=49192
看完这个几个帖子,总结下就是可能是函数的名字和变量名字起的一样冲突了。
但是我的函数都在封装在类里面应该不会有这个问题。
我看错误是说clothing,我还搜索了,并没有发现有什么冲突。
想起来之前群里有人测试了之前商店代码也出现了存档问题,于是想可能是因为我升级了renpy版本,
我把renpy版本降低为7,果然这个错误就消失。
renpy7和renpy8的区别就是python3和python2.7的区别。
于是不用renpy关键字,直接搜这个错误,果然发现了问题。
https://stackoverflow.com/questi ... e-dict-keys-objects
这个这个帖子里有解释,就是字典的keys函数,在python3和python2.7有区别。
所以修改了Inventory class里的get_items就可以解决问题。并且加上注释,省的之后忘记这里为什么这么写。
修改前:
[RenPy] 纯文本查看 复制代码 # 返回背包里的物品.
def get_items(self):
return self.stock.keys()
修改后
[RenPy] 纯文本查看 复制代码 # 返回背包里的物品.
def get_items(self):
## self.stock.keys() 返回一个dict_keys object
## 但是这个object会产生一个错误。
## TypeError: can't pickle dict_keys objects
## 需要手动转换为list
return list(self.stock.keys())
这里有一些debug的技巧分享给大家:
(1)
碰到错误,可以先去搜索错误信息,可能就可以找到类似的问题,从而找到解决的办法。
(2)
用版本管理工具,如果有错误,可以存一份修改过的,对比改之前和改之后的,可能会发现问题所在。
(3)
有时候的错误来自于不同版本的renpy 引擎,可以退回到之前的版本,再看看有没有错误,如果没有,就对比下这次更新,更新了什么。
(4)
有时候也可以搜python或者java(安卓)相关的不一定要带上renpy关键字。
|