2013-11-09 59 views
4

我正在嘗試使用名爲bidi的Python包。 在這個包(algorithm.py)的模塊中,有一些行會給我錯誤,儘管它是包的一部分。TypeError:不支持的操作數類型爲+:'dict_keys'和'列表'

下面是幾行:

_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版本有什麼關係?我很感激這方面的幫助。

回答

10

在Python 3.x中,dict.keys返回dictionary view

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

文檔中它被稱爲['字典view'(http://docs.python.org/3.3/tutorial /datastructures.html#id3) – alko

+0

@alko - 確實。我調整了我的帖子,並添加了我發現的詳細解釋視圖的甜蜜鏈接。 – iCodez

2

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

要達到你想要什麼,你需要將其轉換爲一個列表:

X6_IGNORED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF', 'B'] 
相關問題