web-dev-qa-db-ja.com

なぜPython 3はdict.itemsをlist()でラップする必要があるのですか?

私はPython 3.を使用しています。Python IDE警告:

_features = { ... }
for k, v in features.items():
    print("%s=%s" % (k, v))
_

警告: "Python3のサポートは次のようになります... list(features.items())"

また、これについては http://docs.python.org/2/library/2to3.html#fixers で言及されています。

また、listへの呼び出しで、dict.items()、dict.keys()、およびdict.values()の既存の使用法をラップします。

なぜこれが必要なのですか?

42
Dewfy

この「追加の予防措置」の警告は安全に無視できます。コードは、両方のバージョンのPythonで同じlistがなくても動作します。リストが必要な場合は異なる動作をします(ただし、ケース):実際、features.items()はPython 2ではlistですが、Python 3ではviewです。イテレート可能として使用しても同じように機能します、あなたの例のように。

これで、Python 2からPython 3への変換ツール2to3は安全性の面でエラーになり、dict.items()を使用するときにlistが本当に必要だと仮定します。 (質問のように)、その場合、Python 3のdict.items()(ラッピングlistなし)の方が優れています(リストが作成されないため、高速でメモリ消費が少なくなります)。

具体的には、これはPython code2コードがビューに対して明示的に反復できることを意味します:for k, v in features.viewitems()(Python 3では2to3によってfeatures.items()に変換されます)。 IDEはPython 3でforステートメントが非常に優れているため、コードがPython 2であると考えているため、Python 3のサポートに関する警告はありません。

41
Eric O Lebigot

Python 2、メソッドitems()keys()およびvalues()は、辞書の内容の「スナップショットを撮る」ために使用され、これは、リストを繰り返し処理しているときに辞書が変更された場合、リストの内容はnotに変更されることを意味していました。

Python 3)では、これらのメソッドは viewオブジェクト を返します。その内容は、辞書の変更に応じて動的に変更されます。したがって、これらのメソッドの結果に対する反復の動作が以前のバージョンと一貫性を保つために、list()への追加の呼び出しをPython =3。ビューオブジェクトのコンテンツの「スナップショットを撮る」。

30

Python 3は、Python 2が返すリストと期待するいくつかの演算子ではなく、 Dictionary View Object )を返します正しくない可能性があります-また、基礎となる辞書が変更されると、View Objectも変更されます(繰り返し処理しているコードで、好ましくない驚きを引き起こす可能性があります)。

6
Steve Barnes

In Python 3、dict.items()dict.keys()、およびdict.values()はイテレータです。したがって、リストを期待している場合、リストで機能するが必ずしもイテレータではない操作を行うとエラーが発生することがありますlen(dict.items())として(TypeErrorを生成します)。

[〜#〜]修正[〜#〜]

Python 3でdict.items()を呼び出して返されるdict_itemsは、実際に__len__()を持ち、notを生成しますTypeErrordict_itemsオブジェクトはリストではありませんが、append()index()などのlistメソッドはありません。

また、HamidiとBarnesの状態による他の(はるかに良いと思います)回答として、dict_itemsdictが変更されると動的に変化するビューオブジェクトです。

2
Joel Cornett

_2to3_を使用してプロジェクトをpython 3に変換する場合、より簡潔な出力のためにdict fixerを除外することでこれを無効にできます。

_$ 2to3 -x dict *
_

iteritems()iterkeys()https://docs.python.org/2/library/2to3.html#2to3fixer-dict に注意して、手動で修正してください。

0
F. Malina