2

我正在尝试将名为heroprotocol的 Python 库从 Python 2 移植到 Python 3。该库用于解析名为《风暴英雄》的在线游戏的重播文件,目的是从文件中获取数据(即谁与谁对战,他们什么时候死的,比赛什么时候结束,谁赢了,等等)。

这个库似乎是为 Python 2 创建的,由于我使用的是 Python 3(特别是 Anaconda、Jupyter notebook),我想将其转换为 Python 3。

我遇到的具体问题是当我跑步时

header = protocol.decode_replay_header(mpq.header['user_data_header']['content'])

这应该得到一些关于重播文件的基本数据,我得到这个错误:

TypeError: ord() expected string of length 1, but int found

我用谷歌搜索了这个ord()函数,发现了一些关于ord()在 Python 3 中使用的帖子,但没有一个能解决我遇到的问题。我也尝试在 Github 的“问题”部分发帖,但我还没有收到任何回复。

为什么我看到这个错误?

4

1 回答 1

1

根据您提出的问题,异常发生在decoders.py 的第 69 行

self._next = ord(self._data[self._used])

这在 Python 2 中成功但在 Python 3 中失败的明显原因是它self._data是一个字节串。在 Python 2 中,字节串是“标准”字符串对象,因此索引到一个会返回该位置的字符(本身就是一个字符串)……</p>

# Python 2.7
>>> b'whatever'[3]
't'

…并且调用ord()结果的行为符合预期:

>>> ord(b'whatever'[3])
116

然而,在 Python 3 中,一切都不同了:标准的字符串对象是一个 Unicode 字符串,而字节字符串是整数序列。因此,对字节串的索引直接返回相关的整数……</p>

# 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]

......当然,结果可能会揭示更多问题(超出此问题的范围)。

于 2018-01-20T20:31:56.373 回答