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 に答える