[英]Why does ord() fail when porting from Python 2 to Python 3?
我試圖將一個名為heroprotocol的Python庫從Python 2 移植到Python3 。該庫用於解析名為Storms of Storm的在線游戲的重播文件,目的是從文件中獲取數據(即誰與誰對戰? ,他們什么時候死亡,游戲何時結束,誰贏了,等等)。
該庫似乎是為Python 2創建的,並且由於我使用的是Python 3(特別是Jupyter筆記本電腦的Anaconda),我想將其轉換為Python 3。
我遇到的特定問題是我跑步時
header = protocol.decode_replay_header(mpq.header['user_data_header']['content'])
應該獲得有關重播文件的一些基本數據,我收到此錯誤:
TypeError: ord() expected string of length 1, but int found
我在ord()
函數上進行了搜索,發現了一些關於在Python 3中使用ord()
帖子,但是沒有一個解決了我遇到的問題。 我也嘗試在Github上的“問題”部分中發帖 ,但我沒有得到任何回復。
為什么會看到此錯誤?
根據您提出的問題 ,該異常發生在解碼器.py的第69行 :
self._next = ord(self._data[self._used])
在Python 2中成功但在Python 3中失敗的明顯原因是self._data
是字節字符串。 在Python 2中,字節串是“標准”字符串對象,因此索引為1會返回該位置的字符(本身是字符串)…
# Python 2.7
>>> b'whatever'[3]
't'
…並在結果上調用ord()
的行為符合預期:
>>> ord(b'whatever'[3])
116
但是,在Python 3中, 一切都不同 :標准字符串對象是Unicode字符串,而字節字符串則是整數序列。 因此,索引到字節串中會直接返回相關的整數…
# Python 3.6
>>> b'whatever'[3]
116
…因此,在該整數上調用ord()
毫無意義:
>>> ord(b'whatever'[3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected string of length 1, but int found
因此,您應該能夠通過簡單地刪除該行和類似行上對ord()
的調用來防止您在此處詢問的特定異常:
self._next = self._data[self._used]
…盡管當然有可能因此而發現更多問題(超出此問題的范圍)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.