Python pickle, кажется, ломается внутри класса, но не в сценарии командной строки - PullRequest
2 голосов
/ 09 ноября 2010

Я пытался извлечь некоторые словари из базы данных.Я вернулся к использованию модуля маршала, но все еще задавался вопросом, почему Pickle испытывает такие трудные времена, не сериализуя некоторые данные.Вот сеанс Python командной строки, показывающий, что я пытаюсь сделать:загружает ошибки детали.Струны, которые я пытаюсь загрузить, протравливаются так же, как и выше.Я даже пытался скопировать точную строку, которая выводится в сеансе командной строки выше, и просто пытался ее распечатать, но безуспешно.Вот код для этой последней попытки:

class Resource:

    _service = 'unknown'
    _protocol = 'unknown'
    _key = 'unknown'

    '''
    Factory method that creates an appropriate instance of one of Resource’s subclasses based on 
    the type of data provided (the data being a serialized dictionary with at least the keys 'service', 
    'protocol', and 'key'). 
    @param resource_data (string) -- the data used to create the new Resource instance. 
    '''
    @staticmethod
    def resource_factory(resource_data):
        # Unpack the raw resource data and then create the appropriate Resource instance and return. 
        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: " + unpacked)
        service = unpacked['service']
        protocol = unpacked['protocol']
        key = unpacked['key']

        if (service == 'amazon'):
            return AmazonResource(service=service, protocol=protocol, key=key)
        elif (service == 'fs'):
            return FSResource(service=service, protocol=protocol, key=key)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

Я смог решить эту проблему после внесения некоторых упрощений и отладки в django.Основная проблема заключалась в том, что в самом классе Resource были некоторые ошибки, которые мешали правильному завершению метода resource_factory.Сначала я пытался объединить строку и словарь, который выдавал ошибку.У меня также были некоторые ошибки в других местах класса, где я ссылался на переменные экземпляра _service, _protocol и ключ без '' (опечатки).

В любом случае, интересно то, что когда я использовал этот код в инфраструктуре пользовательских полей Django, возникали ошибки, и я не видел ни одного реального сообщения, указывающего на проблему.Операторы отладки предположили, что это была проблема с нагрузками, но на самом деле это была проблема с самим оператором отладки и некоторым кодом, который появился позже.Когда я попытался реализовать это поведение, используя свойства модели вместо пользовательских полей модели для данных, которые я сохранял, ошибки на самом деле были распечатаны правильно, и я смог быстро отладить.

0 голосов
/ 09 ноября 2010

Ваш код работает. Как вы это тестируете?

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

выходы

# DEBUG:root:Unpacked: {'protocol': 'stream', 'service': 'amazon', 'key': 'lajdfoau09424jojf.flv'}
...