2016-04-07 6 views
0

Ich wollte meine Anwendung in Wäscht verwenden und anschließend das Tutorial here, die im Jahr 2011Get Bytes Objekt von Bytes in String-Objekt zitiert

geschrieben Wenn ich versuche, Daten unpickle in diesem Block:

def results_to_instances(request, results): 
    instances = [] 
    for r in results: 
     cls = pickle.loads('{0}'.format(r.get('cls'))) 
     id = r.get('id') 
     instance = request.db.query(cls).get(id) 
     instances.append(instance) 
    return instances 

ich einen Fehler von den pickle.loads get() Befehl:

TypeError: 'str' does not support the buffer interface 

Wenn ich was '{0}'.format(r.get('cls')) kehrt zu überprüfen, ist es type str, aber der Wert ist "b'foo'".

Wie bekomme ich das Byte-Objekt aus der Zeichenfolge? Die Codierung gibt nur b"b'foo'" zurück.

Die Werte werden in diesem Block gebeizt:

def first_index(self, writer): 
     oid = u'{0}'.format(self.id) 
     cls = u'{0}'.format(pickle.dumps(self.__class__)) 
     attributes = [] 
     for attr in self.__whoosh_value__.split(','): 
      if getattr(self, attr) is not None: 
       attributes.append(str(getattr(self, attr))) 
     value = u' '.join(attributes) 
     writer.add_document(id=oid, cls=cls, value=value) 

Also, wenn es eine Möglichkeit, ist es an der Wurzel zu beheben, das besser sein würde.

Antwort

0

Verwenden Sie einfach r.get('cls'). Wrapping es in '{0}'.format() macht eine bytes in str in erster Linie, die nicht das ist, was Sie überhaupt wollen. Gleiches gilt für das Umbrechen von pickle.dumps (das sofortige Konvertieren des nützlichen bytes kehrt zu der unbrauchbaren formatierten Version zurück). Grundsätzlich machen alle Ihre Verwendungen von '{0}'.format() keinen Sinn, weil sie str machen, wenn Sie versuchen, mit den Rohdaten zu arbeiten.

+0

Funktioniert die '' {0} '' nicht? Ein Beispiel für das vollständige Ergebnis ist "b" \ x80 \ x03cserver.models.models \ ntext \ nq \ x00.'' – Niel

+0

Schnell ausprobiert, bekomme ich den gleichen Fehler. Obwohl 'r.get ('cls')' ''b'foo'' zurückgibt, ist es immer noch type str. Was bedeutet das? – Niel

+0

@Niel: Es ist, weil Sie auch den gleichen Fehler hatten, als Sie es einlegten. Sie haben in ein 'format' gewickelt, das die' Bytes' in 'str' konvertiert. Alle '{0} '. Format (x)' does ist stringify 'x' (es ist in den allermeisten Fällen gleichbedeutend mit' str (x) '), aber Gurken sind ein binäres Datenformat und haben kein Geschäft konvertiert zu 'str'. – ShadowRanger