2011-12-04 3 views
2
Iは、ユニットテストで(例として)次のコードは

Pythonのarray.tostringは()内のNULバイトを有すること

をテストケースた

アサーションは、次のエラーで失敗

def test(self): 
    a = array('u','\0'*3) 
    a[0] = 'h' 
    a[1] = 'h' 
    a[2] = 'h' 

    self.assertEqual(a.tostring(), "hhh") 

AssertionError: b'h\x00\x00\x00h\x00\x00\x00h\x00\x00\x00' != 'hhh' 

今作成した配列は4バイト長のUnicode文字のため、入力したすべての文字に対して余分な3 NULバイトがあることを理解しています。私の質問は次のとおりです:

  1. 文字列 "hhh"を私のアサートのインラインのUnicode表現に変換できますか?
  2. 配列を作成するためのasciiオプションはありますか?

EDIT:出ている質問に答えるために: 1.私は、Python 3 2.を使用しています配列をインポートすることができ、モジュールアレイから来ている:配列のインポート配列

+0

配列とは何ですか? (どこからインポートされたのですか?または何が定義されていますか?) –

+0

実行されていないので質問します。>>> array.array( 'u'、 '\ 0' * 3)はトレースバックを返します。 –

+0

こんにちは申し訳ありませんが、配列のインポート配列から行を持っている必要があります – Aly

答えて

3

から私はあなたを想定Python3で動作していますが、arrayの場合は'c'というオプションがありません。この場合

は、私が

a = array.array("b",4*(0,)) 
a[0] = 'h' 
a[1] = 'h' 
a[2] = 'h' 

を行うだろう別のオプションは、

a=array.array('u', "hhh") # the same as yours, but shorter 
a.tounicode() 

だろう。しかし、あなたは、Unicode文字列ではなくbytes()オブジェクトを持っています。

1

あなたがしたことは明示的にあなたの配列のbytes表現を要求することでした。もちろん、これはユニコード表現と等価ではありません。ドキュメントから

array.tostring(): Deprecated alias for tobytes().

array.tobytes(): Convert the array to an array of machine values and return the bytes representation (the same sequence of bytes that would be written to a file by the tofile() method.)

New in version 3.2: tostring() is renamed to tobytes() for clarity.

代わりtounicodeを使用する必要があります。

あなたは、Python 2.xからいくつかのコードを移行する場合
>>> import array 
>>> s = "a\xbb\ucccc\U0001dddd" 
>>> array.array('u', s).tounicode() == s 
True 

、あなたはこれが自然と同等であることがわかりますあなたがそこに見るもののうち、上記のスニペットのPython 2.xバージョンの唯一の違いはs = u"etc etc"です。

タイプ 'u'は、まれにアクセスされたアレイモジュールの角です。それ自体がPythonの暗いコーナーです。 Python 2.xから移行しない場合は、達成しようとしていること(変更可能な文字列ですか?)を説明し、いくつかのガイダンスを得ることができます。

+0

変更可能な文字列実際、私はギャップバッファを実装しています。任意のアドバイスをお待ちしております – Aly

+0

おそらく匿名のドライブバイダウン者は説明や修正を残したいかもしれませんか? –

+0

'tostring()'はバイトオブジェクトを "明示的に"要求することはほとんどありません。"tostring"という名前のメソッドが文字列を返すと期待するのは全く不合理ではないようです。 IMOではtounicodeではなくtobytesにエイリアスを付けるという決定は、最小の驚きの原則に違反しています。しかし、ねえ、私はBDFLではない。 – Porculus