9

文字列をヌル文字 ("\x00") で埋めたいと思っていました。私はこれを行う方法をたくさん知っているので、代替案で答えないでください. 私が知りたいのは、Python のstring.format()関数がヌルでのパディングを許可しないのはなぜですか?

テストケース:

>>> "{0:\x01<10}".format("bbb")
'bbb\x01\x01\x01\x01\x01\x01\x01'

これは、16 進エスケープ文字が一般的に機能することを示しています。

>>> "{0:\x00<10}".format("bbb")
'bbb       '

ただし、「\x00」はスペース (「\x20」) に変換されます。

>>> "{0:{1}<10}".format("bbb","\x00")
'bbb       '
>>> "{0:{1}<10}".format("bbb",chr(0))
'bbb       '

それを行う他のいくつかの方法を試してみてください。

>>> "bbb" + "\x00" * 7
'bbb\x00\x00\x00\x00\x00\x00\x00'

これは機能しますが、使用しませんstring.format

>>> spaces = "{0: <10}".format("bbb")
>>> nulls  = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True

chr(0x20)Python は、ヌル ( ) の代わりにスペース ( ) を明らかに置き換えていますchr(0x00)

4

3 に答える 3

4

Python 2.7 のソース コードを掘り下げたところ、問題は./Objects/stringlib/formatter.h718 ~ 722 行 (バージョン 2.7.3)のこのセクションにあることがわかりました。

/* Write into that space. First the padding. */
p = fill_padding(STRINGLIB_STR(result), len,
                 format->fill_char=='\0'?' ':format->fill_char,
                 lpad, rpad);

問題は、パディング文字が指定されていない場合にゼロ/ヌル文字 ( '\0') がデフォルトとして使用されていることです。これは、この動作を有効にするためです:

>>> "{0:<10}".format("foo")
'foo       '

atでformat->fill_char = ' ';デフォルトとして設定することは可能かもしれませんが、後でチェックする後方互換性について少しあります。いずれにせよ、私の好奇心は満たされます。これよりも多くの歴史や理由の説明があれば、他の誰かの答えを受け入れます。parse_internal_render_format_spec()./Objects/stringlib/formatter.h:186'\0'

于 2013-05-24T19:57:27.427 に答える
2

元の質問に対する答えは、それが python のバグだったということです。

許可されていると文書化されていましたが、許可されていませんでした。2014 年に修正されました。python 2 の場合、修正は 2.7.7 または 2.7.8 のいずれかで最初に登場しました (どちらを確認するかはわかりません)。

元の追跡された問題

于 2016-05-17T17:27:26.390 に答える
0

Python2.7のstring.formatメソッドは Python3 からのバックポートであるためstring.formatです。Python2.7 Unicode は Python 3 文字列で、Python2.7 文字列は Python3 バイトです。文字列は、Python3 でバイナリ データを表現するのに不適切な型です。フォーマットメソッドを持たないバイトを使用します。formatしたがって、Python3 で文字列になったのは unicode 型だけだったはずなのに、なぜ 2.7 では文字列のメソッドなのかを尋ねる必要があります。

その答えは、そこにあるのは便利すぎるということだと思います。

format関連する問題として、バイトがまだない理由

于 2013-05-24T19:39:49.397 に答える