10

我正在尝试使用一个名为 bidi 的 Python 包。在这个包(algorithm.py)的一个模块中,有一些行给了我错误,尽管它是包的一部分。

以下是这些行:

_LEAST_GREATER_ODD = lambda x: (x + 1) | 1
_LEAST_GREATER_EVEN = lambda x: (x + 2) & ~1

X2_X5_MAPPINGS = {
    'RLE': (_LEAST_GREATER_ODD, 'N'),
    'LRE': (_LEAST_GREATER_EVEN, 'N'),
    'RLO': (_LEAST_GREATER_ODD, 'R'),
    'LRO': (_LEAST_GREATER_EVEN, 'L'),
}

# Added 'B' so X6 won't execute in that case and X8 will run its course
X6_IGNORED = X2_X5_MAPPINGS.keys() + ['BN', 'PDF', 'B']
X9_REMOVED = X2_X5_MAPPINGS.keys() + ['BN', 'PDF']

如果我在 Python 3 中运行代码,我会收到以下错误消息:

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    from bidi.algorithm import get_display
  File "C:\Python33\lib\site-packages\python_bidi-0.3.4-py3.3.egg\bidi\algorithm.py", line 41, in <module>
    X6_IGNORED = X2_X5_MAPPINGS.keys() + ['BN', 'PDF', 'B']
TypeError: unsupported operand type(s) for +: 'dict_keys' and 'list'

尽管这是 bidi 包的一部分,但为什么会出现此错误?它与我的 Python 版本有什么关系吗?我很感激这方面的任何帮助。

4

3 回答 3

19

在 Python 3.x 中,dict.keys返回一个字典视图

>>> a = {1:1, 2:2}
>>> a.keys()
dict_keys([1, 2])
>>> type(a.keys())
<class 'dict_keys'>
>>>

您可以通过将这些视图放入list

X6_IGNORED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF', 'B']
X9_REMOVED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF']

实际上,您甚至.keys不再需要,因为迭代字典会产生它的键:

X6_IGNORED = list(X2_X5_MAPPINGS) + ['BN', 'PDF', 'B']
X9_REMOVED = list(X2_X5_MAPPINGS) + ['BN', 'PDF']
于 2013-11-09T14:27:25.763 回答
7

是的,它与您的 Python 版本有关。在 Python 2.x 中,dict.keys返回字典键的列表。在 Python 3.x 中,它提供了键的视图对象

您可以调用list()结果以使其成为列表,或者只是调用list()整个字典作为快捷方式

于 2013-11-09T14:28:50.243 回答
3

在 Python 3.x 中,dict.keys不返回列表,而是返回view对象,dict_keys.

要实现您想要的,您需要将其转换为列表:

X6_IGNORED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF', 'B']
于 2013-11-09T14:29:20.837 回答