在以前的Python 2程序,我用下面這行寫一個字節的二進制文件:寫入一個字節在Python 3.x的文件
self.output.write(chr(self.StartElementNew))
但因爲Python 3,你不能將字符串和字符串寫入流,而不先將它們編碼爲字節(這對於適當的多字節字符支持有意義)
現在是否存在諸如byte(self.StartElementNew)之類的內容?如果可能的話,與Python 2的兼容性?
在以前的Python 2程序,我用下面這行寫一個字節的二進制文件:寫入一個字節在Python 3.x的文件
self.output.write(chr(self.StartElementNew))
但因爲Python 3,你不能將字符串和字符串寫入流,而不先將它們編碼爲字節(這對於適當的多字節字符支持有意義)
現在是否存在諸如byte(self.StartElementNew)之類的內容?如果可能的話,與Python 2的兼容性?
對於範圍內0-127的值,下面的行總是會產生在Python 2的權利類型(str
)和3(bytes
):
chr(self.StartElementNew).encode('ascii')
這並不適用於在工作值範圍128-255,因爲在Python 2中,str.encode()
調用包含使用ASCII作爲編解碼器的隱式str.decode()
,這將失敗。
對於在0-255範圍內的字節,我會定義一個單獨的功能:
if sys.version_info.major >= 3:
as_byte = lambda value: bytes([value])
else:
as_byte = chr
然後使用該寫入單字節時:
self.output.write(as_byte(self.StartElementNew))
或者,使用six
library,它有six.int2byte()
function;該庫的Python版本測試爲你提供你用合適的版本的功能:
self.output.write(six.int2byte(self.StartElementNew))
另一種選擇,其與Python 2和3的工作原理,是使用struct
:
import struct
self.output.write(struct.pack('B', self.StartElementNew))
由於。沒有測試版本沒有這樣一個簡單的事情的解決方案? – galinette
@galinette:是的,當編寫polyglot代碼時,並非所有事情都可以通過捕獲'ImportError'或'NameError'來完成,恐怕。 –