エラーの説明:「NoneType」オブジェクトは反復可能ではありません
python2では、NoneTypeはNoneのタイプです。Python3では、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
Guidoは、身元チェックに対してより堅牢is
である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を含む変数を反復するループ構造に遭遇しました。操作は、__iter__
、Noneのメソッドをました。
Noneには__iter__
メソッドが定義されていないため、Pythonの仮想マシンは何が見えるかを通知します。NoneTypeには__iter__
メソッドがありません。
これが、Pythonのダックタイピングのイデオロギーが悪いと見なされている理由です。プログラマーは変数を使用して完全に妥当な処理を実行し、実行時にNoneで汚染され、Python仮想マシンが兵士を配置しようとし、カーペット全体に無関係なナンセンスの束を吐き出します。
Noneが発生したときに何をするかを定義していないため、そのようなプログラムはコンパイルできないため、JavaまたはC ++にはこれらの問題はありません。Pythonは、例外的な状況下では機能することが期待できない多くのことを実行できるようにすることで、プログラマーに多くのロープをかけることができます。Pythonはイエスマンであり、JavaやC ++がそうであるように、自分への危害を防ぐために、イエス・サーと言っています。
None
シーケンスとしてに強制され、それは完全に無害で、空のシーケンスを生成しなければなりません。