Python array.tostring () содержит NUL байтов - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть следующий код (в качестве примера) в unittest TestCase

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 байта, следовательно, дополнительные 3 байта NUL для каждого введенного мной символа. Мои вопросы:

  1. Могу ли я преобразовать строку "hhh" в представление Unicode, встроенное в мой assert?
  2. Существует ли опция ascii для создания моего массива?

РЕДАКТИРОВАТЬ: ответить на возникшие вопросы: 1. Я использую Python 3 2. массив поступает из модуля массив, может быть импортирован с: из массива импорта массив

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Полагаю, вы работаете с Python3, в котором, по-видимому, отсутствует опция 'c' для array.

В этом случае я бы сделал

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

Другой вариант будетbe

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

Но тогда у вас есть строка в юникоде, а не объект bytes().

1 голос
/ 05 декабря 2011

Вы явно запросили bytes представление вашего массива.Естественно, это не равно представлению Unicode.

Из документов:

array.tostring (): Устаревший псевдоним для tobytes ().

array.tobytes (): преобразовать массив в массив машинных значений и вернуть представление байтов (ту же последовательность байтов, которая была бы записана в файл методом tofile ().)

Новое в версии 3.2:Для ясности tostring () переименовывается в tobytes ().

Вместо этого вам нужно использовать tounicode:

>>> import array
>>> s = "a\xbb\ucccc\U0001dddd"
>>> array.array('u', s).tounicode() == s
True

Если вы переносите некоторый код из Python 2.xвы обнаружите, что это естественный эквивалент того, что вы видите там;единственное отличие в Python 2.x версии приведенного выше фрагмента кода будет s = u"etc etc".

Тип 'u' - это темный редко посещаемый угол модуля массива, который сам является темным углом Python.Если вы НЕ мигрируете с Python 2.x, вы можете сказать, чего вы пытаетесь достичь (изменяемые строки?), И получить некоторые рекомендации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...