web-dev-qa-db-ja.com

base64.b64encode()がbytesオブジェクトを返すのはなぜですか?

base64.b64encode()の目的は、バイナリデータをASCIIセーフな「テキスト」に変換することです。ただし、メソッドはバイト型のオブジェクトを返します。

_>>> import base64
>>> base64.b64encode(b'abc')
b'YWJj'
_

単純にその出力とdecode()を取得するのは簡単ですが、私の質問は、bytesではなくstrを返すbase64.b64encode()の重要性?

27
gardarh

Base64.b64encode()関数の目的は、バイナリデータをASCIIセーフな「テキスト」に変換することです

Pythonはこれに同意しません-base64は意図的に binary transform として分類されています。

これは、Python 3での設計上の決定であり、バイトとテキストの分離を強制し、暗黙的な変換を禁止します。Pythonは、これに関してbytes.encode tも存在するため、b'abc'.encode('base64')AttributeErrorを発生させます。

言語が取る意見は、バイト文字列オブジェクトはalreadyエンコードされているというものです。バイトをテキストにエンコードするコーデックは、このパラダイムに適合しません。なぜなら、バイトドメインからテキストドメインに移動したいときは、decodeであるためです。 rot13エンコーディングも、同じ理由で 標準エンコーディング のリストから追放されたことに注意してください。Python 3パラダイムに適切に適合しませんでした。

作成するパフォーマンス引数もあります。Python base64出力のデコードを自動的に処理します。これは、ASCIIエンコードバイナリ表現ですbinascii モジュールのCコードによって生成され、Pythonテキストドメインのオブジェクト。実際にバイトが必要な場合、ASCIIに再びエンコードすることにより、デコードを元に戻す必要があります。これは無駄な往復であり、不必要な二重否定になります。テキストへのステップ。

20
wim

b64encode()がその出力で何をしたいのかを知ることは不可能です。

多くの場合、エンコードされた値をテキストとして扱いたい場合がありますが、他の多くの場合(たとえば、ネットワーク経由で送信する場合)、代わりにバイトとして扱いたい場合があります。

b64encode()がわからないため、推測を拒否します。また、入力はbytesであるため、暗黙的にstrに強制されるのではなく、出力は同じ型のままです。

指摘したように、出力をstrにデコードするのは簡単です。

_base64.b64encode(b'abc').decode('ascii')
_

...また、結果について明示的である。

余談ですが、base64.b64decode()(注:decode、notencode)は、バージョン3.3以降strを受け入れました。変更は やや物議を醸す でした。

17
Zero Piraeus