エラー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
です。
コード:for row in data:
エラーメッセージ:TypeError: 'NoneType' object is not iterable
どのオブジェクトが文句を言っていますか? row
とdata
の2つを選択します。 for row in data
では、どれが反復可能である必要がありますか? data
のみ.
data
の問題は何ですか?その型はNoneType
です。 None
だけがNoneType
型を持ちます。だからdata is None
。
あなたはIDEでこれを検証することができます。 for
ステートメントの前のprint "data is", repr(data)
、および再実行.
次に何をする必要があるのか考えてみてください。「データなし」をどのように表すべきですか?空のファイルを書きますか?例外を発生させるのか、警告を記録するのか、それとも沈黙を守るのか。
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.
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
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
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
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と言っています。
このエラーを引き起こす可能性があるもう一つのことはあなたが関数からのリターンと等しい何かを設定しているが実際には何も返さないことを忘れているときです。
例:
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を取得するだけです」
これは、データ変数がNone(タイプNoneType)を渡していることを意味します。これは、nothingと同等です。だからあなたがやろうとしているように、それはリストとして反復することはできません。
あなたはこのような引数でwrite_fileを呼び出しています:
write_file(foo, bar)
しかし、あなたは正しく 'foo'を定義していないか、あなたのコードにタイプミスがあるので新しい空の変数を作成してそれを渡しています。
私にとっては、Python 3の代わりに Groovy hat をオンにした場合でした。
return
関数の最後にあるdef
キーワードを忘れました。
数か月間、Python 3を本格的にコーディングしていませんでした。ルーチンで評価された最後のステートメントがGroovyの方法ごとに返されていると考えていました。
スタックトレースを見て、try: ... except TypeError: ...
ブロックデバッグを挿入/コードを介してステップ実行して、何が間違っているかを把握しました。
メッセージの解決策は間違いなく私にエラーを飛び出させませんでした。