簡體   English   中英

從Python 2移植到Python 3時,為什么ord()失敗?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM