Python pickle的类内似乎会出现问题,但在命令行脚本中不会

2024-09-30 14:37:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图从数据库中取出一些词典。我又回到了使用marshal模块,但仍在想为什么pickle在取消数据序列化方面遇到了如此困难。下面是一个命令行python会话,它基本上显示了我要做的事情:

>>> a = {'service': 'amazon', 'protocol': 'stream', 'key': 'lajdfoau09424jojf.flv'}
>>> import pickle; import base64
>>> pickled = base64.b64encode(pickle.dumps(a))
>>> pickled
'KGRwMApTJ3Byb3RvY29sJwpwMQpTJ3N0cmVhbScKcDIKc1Mna2V5JwpwMwpTJ2xhamRmb2F1MDk0MjRqb2pmLmZsdicKcDQKc1Mnc2VydmljZScKcDUKUydhbWF6b24nCnA2CnMu'
>>> unpickled = pickle.loads(base64.b64decode(pickled))
>>> unpickled
{'protocol': 'stream', 'service': 'amazon', 'key': 'lajdfoau09424jojf.flv'}
>>> unpickled['service']
'amazon'

这一切都很好,但是当我在一个类的工厂方法中尝试这种方法时,它看起来像酸洗负荷零件出错。我要加载的字符串的酸洗方式与上述相同。我甚至尝试过复制上面命令行会话中pickle的确切字符串,并尝试取消pickle,但没有成功。下面是后一种尝试的代码:

^{pr2}$

Tags: 方法key字符串import数据库amazonstreamservice
2条回答

你的代码有效。你是怎么测试的?在

import logging
import base64
import pickle
class Resource:
    @staticmethod
    def resource_factory(resource_data):
        resource_data = "KGRwMApTJ3Byb3RvY29sJwpwMQpTJ3N0cmVhbScKcDIKc1Mna2V5JwpwMwpTJ2xhamRmb2F1MDk0MjRqb2pmLmZsdicKcDQKc1Mnc2VydmljZScKcDUKUydhbWF6b24nCnA2CnMu" #hack to just see if we can unpickle this string
        # logging.debug("Creating resource: " + resource_data)
        unencoded = base64.b64decode(resource_data)
        # logging.debug("Unencoded is: " + unencoded)
        unpacked = pickle.loads(unencoded)
        logging.debug("Unpacked: " + repr(unpacked))
        service = unpacked['service']
        protocol = unpacked['protocol']
        key = unpacked['key']

logging.basicConfig(level=logging.DEBUG)
Resource.resource_factory('')

收益率

^{pr2}$

经过一些简化,然后在django中调试,我能够解决这个问题。主要问题是资源类本身存在一些错误,这些错误妨碍了资源工厂方法的正确完成。首先,我试图连接一个字符串和字典,这抛出了一个错误。我在类的其他地方也有一些错误,我在这里引用实例变量_service、_protocol和不带''的键(打字错误)。在

无论如何,有趣的是,当我在Django的自定义字段基础结构中使用这段代码时,会捕捉到错误,而且我没有看到任何实际的消息来指示问题。调试语句表明这是加载问题,但实际上是调试语句本身和后面的一些代码有问题。当我试图使用模型属性而不是为我保存的数据定制模型字段来实现这个行为时,错误实际上被正确地打印出来了,我能够快速地进行调试。在

相关问题 更多 >