Warum gibt base64.b64encode () ein Byteobjekt zurück?

8

Der Zweck von base64.b64encode() besteht darin, binäre Daten in ASCII-sicheren "Text" umzuwandeln. Die Methode gibt jedoch ein Objekt vom Typ Bytes zurück:

%Vor%

Es ist einfach, diese Ausgabe und decode() it zu nehmen, aber meine Frage ist: Was ist eine Bedeutung von base64.b64encode() , die bytes zurückgibt, anstatt eine str ?

    
gardarh 13.03.2017, 21:04
quelle

2 Antworten

7
  

Der Zweck der Funktion base64.b64encode () besteht darin, binäre Daten in ASCII-sicheren "text"

zu konvertieren

Python stimmt dem nicht zu - base64 wurde absichtlich als Binärtransformation klassifiziert.

Es war eine Design-Entscheidung in Python 3, die Trennung von Bytes und Text zu erzwingen und implizite Transformationen zu verbieten. Python ist jetzt so streng darum, dass bytes.encode gar nicht existiert, und so würde b'abc'.encode('base64') eine AttributeError auslösen.

Die Meinung der Sprache ist, dass ein bytestring-Objekt bereits kodiert ist. Ein Codec, der Bytes in Text codiert, passt nicht in dieses Paradigma, denn wenn Sie von der Byte-Domäne zur Text-Domäne wechseln wollen, ist es eine Dekodierung . Beachten Sie, dass rot13 encoding ebenfalls aus der Liste der Standardkodierungen für dasselbe verbannt wurde Grund - es passte nicht richtig in das Python 3 Paradigma.

Es kann auch ein Performance-Argument geben: Nehmen wir an, Python hat automatisch die Decodierung der base64-Ausgabe behandelt, die eine ASCII-codierte binäre Repräsentation ist, die von C-Code aus binascii , in ein Python-Objekt in der Textdomäne. Wenn Sie tatsächlich die Bytes wollten, müssten Sie die Decodierung einfach durch erneutes Codieren in ASCII rückgängig machen. Es wäre eine verschwenderische Rundreise, eine unnötige Doppel-Verneinung. Es ist besser, sich für den Dekodier-zu-Text-Schritt zu entscheiden.

    
wim 14.03.2017, 02:21
quelle
7

Es ist unmöglich für b64encode() zu wissen, was Sie mit seiner Ausgabe machen wollen.

Während Sie in vielen Fällen den codierten Wert in vielen anderen als Text behandeln möchten, z. B. wenn Sie ihn über ein Netzwerk senden, sollten Sie ihn stattdessen als Byte behandeln.

Da b64encode() nicht wissen kann, weigert es sich zu raten. Und da die Eingabe bytes ist, bleibt die Ausgabe derselbe Typ, anstatt implizit auf str gezwungen zu werden.

Wie Sie feststellen, ist die Dekodierung der Ausgabe in str einfach:

%Vor%

... als auch explizit über das Ergebnis.

Nebenbei bemerkt, ist es trotzdem erwähnenswert, dass base64.b64decode() (Anmerkung: de -Code, nicht en code) hat str seit Version 3.3 akzeptiert, die Änderung war etwas umstritten .

    
Zero Piraeus 13.03.2017 22:17
quelle