Я думаю, что лучшее решение должно быть четко и сказать, что вы хотите, чтобы представить число в виде байта (и not as a character):
>>> import struct
>>> struct.pack('B', 128)
>>> '\x80'
Это делает ваш код работает как в Python 2 и Python 3 (в Python 3 результатом является, как и следовало ожидать, объект bytes). Альтернативой в Python 3, будет использовать новый bytes([128])
создать один байт значения 128.
Я не большой поклонник chr()
решений: in Python 3, они производят (характер, а не байт) строка, которая должна быть encoded перед отправкой в любом месте (файл, сокет, терминал, ...) - chr()
в Python 3 является эквивалентом проблемного Python 2 unichr()
вопроса. Преимущество решения struct
состоит в правильном создании байта независимо от версии Python. Если вы хотите отправлять данные через последовательный порт с помощью chr()
, вам необходимо иметь контроль над кодировкой, которая должна быть выполнена впоследствии.Код может работать, если кодировка по умолчанию, используемая Python 3, - это UTF-8 (что, на мой взгляд, так и есть), но это связано с тем, что символы Unicode с кодовой точкой меньше 256 могут быть закодированы как один байт в UTF -8. Это добавляет ненужный слой тонкости и сложности, которые я не рекомендую (это делает код более сложным для понимания и, при необходимости, отладки).
Итак, я настоятельно рекомендую вам использовать подход выше (который был также намекал Стив Барнс и Martijn Питерс): он дает понять, что вы хотите, чтобы произвести байт (а не символов). Это не даст вам сюрпризов, даже если вы запустите свой код с Python 3, и это сделает ваше намерение более ясным и очевидным.
python2 или Python3? (угадывая Python2, но это имеет большое значение). Вы уверены, что 'unichr' - это сбой вызова? Как вы выполняете фактическую отправку возвращаемых данных unichr? –
'unichr()' не существует в Python 3, поэтому это Python 2. 'unichr()' назван 'chr()' в Python 3 (преобразование в символ Unicode). – EOL