TypeError: 'str' はバッファ インターフェースをサポートしていません文字列をバイトに変換する 2 つの方法を提案します。
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
どちらの方法がより Python らしいでしょうか?
見るバイトを文字列に変換する逆の場合も同様です。
ベストアンサー1
のドキュメントを見るとbytes
、bytearray
:
bytearray([ソース[, エンコーディング[, エラー]]])
新しいバイト配列を返します。bytearray 型は、0 <= x < 256 の範囲の整数の可変シーケンスです。可変シーケンス型で説明されている可変シーケンスの通常のメソッドのほとんどと、バイト型が持つほとんどのメソッド (バイトとバイト配列メソッドを参照) を備えています。
オプションのソース パラメータを使用すると、いくつかの方法で配列を初期化できます。
文字列の場合は、エンコーディング (およびオプションでエラー) パラメータも指定する必要があります。その後、bytearray() は str.encode() を使用して文字列をバイトに変換します。
整数の場合、配列はそのサイズになり、null バイトで初期化されます。
バッファ インターフェイスに準拠するオブジェクトの場合、オブジェクトの読み取り専用バッファを使用してバイト配列が初期化されます。
反復可能オブジェクトの場合は、配列の初期内容として使用される 0 <= x < 256 の範囲の整数の反復可能オブジェクトである必要があります。
引数がない場合、サイズ 0 の配列が作成されます。
したがって、bytes
文字列をエンコードする以上のことが可能になります。意味のある任意のタイプのソース パラメータを使用してコンストラクターを呼び出すことができるのは、Python らしいことです。
文字列をエンコードする場合、コンストラクターを使用するよりも Python らしい方法だと思いますsome_string.encode(encoding)
。なぜなら、これが最も自己文書化されているためです。つまり、「この文字列を取得して、このエンコードでエンコードする」という方が明確ですbytes(some_string, encoding)
。コンストラクターを使用する場合、明示的な動詞はありません。
Pythonのソースを確認しました。CPythonをbytes
使用してUnicode文字列を渡すと、PyUnicode_AsEncodedStringは の実装ですencode
。したがって、自分自身を呼び出す場合は間接レベルをスキップするだけですencode
。
また、Serdalis のコメントも参照してください。これは、逆関数であり対称性も優れているunicode_string.encode(encoding)
ため、より Python 的です。byte_string.decode(encoding)