私は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()の既存の使用法をラップします。
なぜこれが必要なのですか?
この「追加の予防措置」の警告は安全に無視できます。コードは、両方のバージョンの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のサポートに関する警告はありません。
Python 2、メソッドitems()
、keys()
およびvalues()
は、辞書の内容の「スナップショットを撮る」ために使用され、これは、リストを繰り返し処理しているときに辞書が変更された場合、リストの内容はnotに変更されることを意味していました。
Python 3)では、これらのメソッドは viewオブジェクト を返します。その内容は、辞書の変更に応じて動的に変更されます。したがって、これらのメソッドの結果に対する反復の動作が以前のバージョンと一貫性を保つために、list()
への追加の呼び出しをPython =3。ビューオブジェクトのコンテンツの「スナップショットを撮る」。
Python 3は、Python 2が返すリストと期待するいくつかの演算子ではなく、 Dictionary View Object )を返します正しくない可能性があります-また、基礎となる辞書が変更されると、View Objectも変更されます(繰り返し処理しているコードで、好ましくない驚きを引き起こす可能性があります)。
In Python 3、dict.items()
、dict.keys()
、およびdict.values()
はイテレータです。したがって、リストを期待している場合、リストで機能するが必ずしもイテレータではない操作を行うとエラーが発生することがありますlen(dict.items())
として(TypeError
を生成します)。
[〜#〜]修正[〜#〜]
Python 3でdict.items()
を呼び出して返されるdict_items
は、実際に__len__()
を持ち、notを生成しますTypeError
。dict_items
オブジェクトはリストではありませんが、append()
、index()
などのlist
メソッドはありません。
また、HamidiとBarnesの状態による他の(はるかに良いと思います)回答として、dict_items
はdict
が変更されると動的に変化するビューオブジェクトです。
_2to3
_を使用してプロジェクトをpython 3に変換する場合、より簡潔な出力のためにdict
fixerを除外することでこれを無効にできます。
_$ 2to3 -x dict *
_
iteritems()
、iterkeys()
https://docs.python.org/2/library/2to3.html#2to3fixer-dict に注意して、手動で修正してください。