类型错误:不支持对“dict_keys”和“list”执行加法操作。

11
我将尝试使用一个名为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'

虽然这是双向文本处理包的一部分,但为什么会出现这个错误呢?它与我的Python版本有关吗?感谢任何对此的帮助。

3个回答

21
在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']

1
在文档中,它被称为字典视图 - alko
@alko - 确定。我修改了我的帖子,并添加了一个详细解释视图的好链接。 - user2555451

8

3
在Python 3.x中,dict.keys不再返回一个列表,而是返回一个view对象,即dict_keys
为了达到你想要的效果,你需要将其转换为列表:
X6_IGNORED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF', 'B']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接