繁体   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