chr()関数の挙動の2と3での違い?
きっかけはchr(03)
という表記がPython2のコードにあったことだった。
これはPython3ではエラーになる。
03の0ってなんやねん
頂いたコメントによると03の0とは8進数を表すための前置きのようである。(どうもありがとうございます。)
0x1aとか0b0110の仲間だったのか。
Python2では使えるこの表記も
>>> chr(03)
'\x03'
>>> chr(3)
'\x03'
Python3では叱られる。正確には0o3と書く必要がありそうだ。
>>> chr(3)
'\x03'
>>> chr(03)
File "<stdin>", line 1
chr(03)
^
SyntaxError: invalid token
数値をバイトに変換する関数としての違い
ここの記述によるとPython2ではchr()を数値からバイトへの変換に用いれたが,Python3ではそれはbytesという関数がそれを担っているらしい。
したがって,Python2で
>>> ''.join(chr(97))
'a'
と書いていたプログラムはPython3では
>>> bytes([97])
b'a'
というリストの形式で書かねばならないらしい。なお前についているbはバイト列であることを示すbである。
今まではencode()で対処してたりしていたが,類似の事例からきちんとシリアル送信の文脈ではchr()の代わりにbyte([])を用いたほうが良さそうである。