为什么python pickle无法在3.7中转储字典

为什么python pickle无法在3.7中转储字典,python,pickle,python-asyncio,python-3.7,Python,Pickle,Python Asyncio,Python 3.7,我最近切换到python的3.7.3版本,并且一直在尝试更新代码以适应新版本。 在切换之前,pickle转储和加载我发送的字典不会有问题,但现在它一直给我一个TypeError:cannotpickletaskstepmethwrapper对象错误 搜索TaskStepMethWrapper显示它可能与asyncio相关,但在我使用Python3.6时没有显示此错误 这是我的密码 def加载指南列表(自): 以open(“guildlist.dadbot”、“rb”)作为sl: 返回pickle

我最近切换到python的3.7.3版本,并且一直在尝试更新代码以适应新版本。 在切换之前,pickle转储和加载我发送的字典不会有问题,但现在它一直给我一个
TypeError:cannotpickletaskstepmethwrapper对象
错误
搜索TaskStepMethWrapper显示它可能与asyncio相关,但在我使用Python3.6时没有显示此错误

这是我的密码

def加载指南列表(自):
以open(“guildlist.dadbot”、“rb”)作为sl:
返回pickle.load(sl.read())
#将指南列表编辑为外部文件
def edit_指南列表(self,dictionary):
以open(“guildlist.dadbot”、“wb”)作为sl:
#试图强行通过字典
pickle.dump(dict(字典),sl)
#将公会注册到公会列表中
加入工会时的异步定义(自我、工会):
#设置初始前缀,以便以后灵活更改
#检查guildlist是否为空(可能只运行一次)
尝试:
self.guildlist=self.load\u guildlist()
除EOFError外:
self.guildlist={}
self.edit\u指南列表(self.guildlist)
#为公会存储一个随机前缀,以便以后可以更改
#应允许公会具有前缀首选项
#还设置公会首选项和状态
如果公会不在self.guildlist中:
#新公会
self.guildlist[guild]={}
self.guildlist[guild][“prefix”]=genPrefix()
self.guildlist[guild][“语音频道”]=“全部”
self.edit\u指南列表(self.guildlist)
以下是回溯:

Ignoring exception in on_guild_join
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/discord/client.py", line 251, in _run_event
    await coro(*args, **kwargs)
  File "main.py", line 68, in on_guild_join
    self.edit_guildlist(self.guildlist)
  File "main.py", line 48, in edit_guildlist
    pickle.dump(dict(dictionary),sl)
TypeError: can't pickle TaskStepMethWrapper objects
Ignoring exception in on_message
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/discord/client.py", line 251, in _run_event
    await coro(*args, **kwargs)
  File "main.py", line 80, in on_message
    self.guildlist = self.load_guildlist()
  File "main.py", line 42, in load_guildlist
    return pickle.loads(sl.read())
EOFError: Ran out of input

这是否与Python 3.6下的
“guildlist.dadbot”
文件完全相同?您使用了错误的函数
pickle.loads()#直接从pickle数据加载。您需要从文件中读取pickle数据的
pickle.load(sl.read())
。@martineau不,这是一个新文件。@Babalaris不会pickle.load()需要一个文件对象而不是字节对象
pickle.load(f)
pickle.load(f.read())相同。