2013-05-24 4 views
8

ヌル文字( "\ x00")で文字列を埋めたいと思っていました。私はこれを行う方法がたくさんあることを知っているので、代わりに答えないでください。私が知りたいのは、なぜPythonのstring.format()関数がヌルで埋め込めないのですか?なぜPythonのstring.formatは " x00"で埋められないのですか?

テストケース:

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

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

>>> "{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 

のPython明確に代入しているスペース(chr(0x20))の代わりに、ヌル(chr(0x00))を使用していません。

+4

私はこの質問を改善することができますので、あなたがdownvoteときにコメントを残してください。私は自分の研究を行い、「ljust」やその他の作業方法を知っています。なぜPython 2.7がこのように動作するのかを知りたい。 – bonsaiviking

+0

'print" bbb "+" \ x00 "* 7'を使うと、スペース7文字列が得られます。シェルは常にスペース文字として "\ x00"を表示します。 print shellがなければ、文字列の 'repr'版を返します。 –

答えて

0

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

私はその答えがそこにあるのはあまりにも便利だと思います。 Pythonの2.7のソースコードを掘り下げるformat on bytesまだ

+0

これは 'u" {0:¥x00 <10} "と同じ結果をもたらします。format(u" bbb ")'。ソースコードは、Unicodeと文字列型が同じフォーマッタを使用していることを示しています。 – bonsaiviking

+0

@bonsaivikingはい、ポイントは '.format'はバイナリデータ用ではなく、バイナリデータ用ではないということです。バイナリデータにUnicodeメソッドを使用しようとするとうまくいくわけではありません。 – cmd

4

がない理由の関連事項として

は、私は問題が./Objects/stringlib/formatter.hから、このセクションでは、ライン718から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')はパディング文字が指定されていないデフォルトとして使用されていることです。これは、この動作を有効にすることです:

​​

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

2

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

許可されていると文書化されていましたが、そうではありませんでした。 Python 2の場合、修正は2.7.7または2.7.8のいずれかで最初に出現しました(どのように伝えるべきかわかりません)

オリジナルトラッキングissue

関連する問題