web-dev-qa-db-ja.com

TypeError: 'NoneType'オブジェクトはPythonでは反復できません

エラーTypeError: 'NoneType' object is not iterableはどういう意味ですか?

私はこのPythonコードでそれを手に入れています:

def write_file(data, filename): # creates file and writes list to it
  with open(filename, 'wb') as outfile:
    writer = csv.writer(outfile)
    for row in data: # ABOVE ERROR IS THROWN HERE
      writer.writerow(row)

dataの値はNoneです。

164
vanza

コード:for row in data:
エラーメッセージ:TypeError: 'NoneType' object is not iterable

どのオブジェクトが文句を言っていますか? rowdataの2つを選択します。 for row in dataでは、どれが反復可能である必要がありますか? dataのみ.

dataの問題は何ですか?その型はNoneTypeです。 NoneだけがNoneType型を持ちます。だからdata is None

あなたはIDEでこれを検証することができます。 forステートメントの前のprint "data is", repr(data)、および再実行.

次に何をする必要があるのか​​考えてみてください。「データなし」をどのように表すべきですか?空のファイルを書きますか?例外を発生させるのか、警告を記録するのか、それとも沈黙を守るのか。

62
John Machin

エラーの説明: 'NoneType'オブジェクトは反復可能ではありません

Python2では、NoneTypeはNoneの型です。 Python 3では、NoneTypeはNoneのクラスです。例えば:

>>> print(type(None))     #Python2
<type 'NoneType'>         #In Python2 the type of None is the 'NoneType' type.

>>> print(type(None))     #Python3
<class 'NoneType'>        #In Python3, the type of None is the 'NoneType' class.

値Noneを持つ変数を繰り返し処理すると失敗します。

for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

値を返さない場合、PythonメソッドはNoneTypeを返します。

def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

以下のようにNoneTypeのループ構成をチェックする必要があります。

a = None 
print(a is None)              #prints True
print(a is not None)          #prints False
print(a == None)              #prints True
print(a != None)              #prints False
print(isinstance(a, object))  #prints True
print(isinstance(a, str))     #prints False

isはアイデンティティチェックに対してより堅牢であるため、Guidoは、Noneのチェックにはisのみを使用すると述べています。平等演算を使用しないでください。それらは独自のバブルアップ実装を吐き出すことができるからです。 Pythonのコーディングスタイルのガイドライン - PEP-008

NoneTypesは卑劣で、ラムダから忍び込むことができます。

import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

NoneTypeは有効なキーワードではありません。

a = NoneType     #NameError: name 'NoneType' is not defined

Noneと文字列の連結:

bar = "something"
foo = None
print foo + bar    #TypeError: cannot concatenate 'str' and 'NoneType' objects

何が起きてる?

Pythonのインタプリタがあなたのコードをpycバイトコードに変換しました。 Python仮想マシンがバイトコードを処理したところ、Noneを含む変数を反復処理するというループ構造が発生しました。 Noneに対して__iter__メソッドを呼び出すことによって操作が実行されました。

Noneには__iter__メソッドが定義されていないので、Pythonの仮想マシンはそれが何であるかを教えてくれます:NoneTypeには__iter__メソッドがありません。

これが Pythonのダックタイピング イデオロギーが悪いと考えられている理由です。プログラマは変数を使って完全に合理的なことを実行し、実行時にNoneに汚染され、python仮想マシンは兵士に働きかけようと試み、カーペットの至るところに無関係な無意味なものをたくさん集めます。

JavaやC++にはこれらの問題はありません。Noneが発生したときの動作を定義していないため、このようなプログラムはコンパイルできません。 Pythonは、例外的な状況下では機能しないはずのことがたくさんできるようにすることで、プログラマーに吊るすためのたくさんのロープを与えます。 JavaやC++がそうであるように、Pythonはあなたが自分に害を及ぼすのをやめさせようとしているのではないかと言ってyes-manと言っています。

62
Eric Leschinski

このエラーを引き起こす可能性があるもう一つのことはあなたが関数からのリターンと等しい何かを設定しているが実際には何も返さないことを忘れているときです。

例:

def foo(dict_of_dicts):
    for key, row in dict_of_dicts.items():
        for key, inner_row in row.items():
            Do SomeThing
    #Whoops, forgot to return all my stuff

return1, return2, return3 = foo(dict_of_dicts)

1回の反復で行変数が「なし」になった場合にもエラーが発生する可能性があるため、これは見つけるのが難しい多少のエラーです。それを見つける方法は、トレースが最後の行で失敗し、関数の内部では失敗しないことです。

関数から1つの変数しか返さない場合、エラーが発生するかどうかわからない...この場合、エラー「 'NoneType'オブジェクトは反復可能ではありません」が実際には「ほらこれらの3つの変数に順番に値を代入するために戻り値を繰り返し処理しますが、繰り返し処理するにはNoneを取得するだけです」

17
gunslingor

これは、データ変数がNone(タイプNoneType)を渡していることを意味します。これは、nothingと同等です。だからあなたがやろうとしているように、それはリストとして反復することはできません。

8
Rod

あなたはこのような引数でwrite_fileを呼び出しています:

write_file(foo, bar)

しかし、あなたは正しく 'foo'を定義していないか、あなたのコードにタイプミスがあるので新しい空の変数を作成してそれを渡しています。

7
clee

私にとっては、Python 3の代わりに Groovy hat をオンにした場合でした。

return関数の最後にあるdefキーワードを忘れました。

数か月間、Python 3を本格的にコーディングしていませんでした。ルーチンで評価された最後のステートメントがGroovyの方法ごとに返されていると考えていました。

スタックトレースを見て、try: ... except TypeError: ...ブロックデバッグを挿入/コードを介してステップ実行して、何が間違っているかを把握しました。

メッセージの解決策は間違いなく私にエラーを飛び出させませんでした。

0
JGFMK