サーチ…


前書き

ここでスタックオーバーフローでは、同じエラーについて重複していることがよく"ImportError: No module named '??????'"ImportError: No module named '??????'NameError: name '???' is not defined SyntaxError: invalid syntax NameError: name '???' is not definedまたはNameError: name '???' is not defined 。これはそれらを減らし、リンクするためのドキュメントを用意するための努力です。

IndentationErrors(またはインデントのSyntaxErrors)

他のほとんどの言語では、インデントは必須ではありませんが、Python(および他の言語:初期のFORTRAN、Makefiles、Whitespace(難解言語)など)ではそうではありません。あなたが別の言語から来た場合、コードをサンプルから自分のコードにコピーしていた場合、または単に新しいコードであれば。

IndentationError / SyntaxError:予期しないインデント

この例外は、インデントレベルが増加し、理由がない場合に発生します。

ここでレベルを上げる理由はありません。

Python 2.x 2.0 2.7
 print "This line is ok"
     print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
     print("This line isn't ok")

ここには2つのエラーがあります。最後のものとインデントがインデントレベルに一致しないことです。ただ1つしか表示されません:

Python 2.x 2.0 2.7
 print "This line is ok"
  print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError / SyntaxError:インデントが外側のインデントレベルと一致しません

あなたは完全に内反していないように見えます。

Python 2.x 2.0 2.7
def foo():
    print "This should be part of foo()"
   print "ERROR!"
print "This is not a part of foo()"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError:インデントされたブロックが必要です

コロン(そして新しい行)の後、インデントレベルが増加しなければなりません。このエラーは発生しなかった場合に発生します。

if ok:
doStuff()

:キーワードを使用しpass単に置くために(それは絶対に何も行いません) ifelseexceptclassmethodまたはdefinitionなく、呼ばれる/条件が成立しているとき、何が起こるかと言う(ただし、後でそれを行う、またはの場合、 except :何もしない)

def foo():
    pass

IndentationError:インデントでのタブとスペースの一貫性のない使用

def foo():
    if ok:
      return "Two != Four != Tab"
        return "i dont care i do whatever i want"

このエラーを回避する方法

タブを使用しないでください。 PythonのスタイルガイドであるPEP8ではお勧めできません。

  1. インデント用に4つのスペースを使用するようにエディタを設定します。
  2. 検索と置換を行い、すべてのタブを4つのスペースに置き換えます。
  3. エディターがタブを8つのスペースとして表示するように設定されていることを確認してください。そうすれば、簡単にエラーを認識して修正できます。

詳細については、 この質問を参照してください。

TypeErrors

これらの例外は、一部のオブジェクトのタイプが異なる必要がある場合に発生します

TypeError:[定義/メソッド]はかかりますか?位置的な議論だけど?与えられた

関数またはメソッドが受け入れ可能な引数よりも多く(または少ない)引数で呼び出されました。

より多くの引数が与えられた場合:

def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined

より少ない引数が与えられた場合:

def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined

:未知数の引数を使用する場合は、 *argsまたは**kwargs使用できます。 * argsと** kwargsを参照してください


TypeError:[operand]のサポートされていないオペランドタイプ: '???'と '???'

オペランドによっては、一部のタイプを一緒に操作することはできません。

たとえば、 +は連結および追加に使用されますが、どちらのタイプにも使用することはできません。たとえば、 'set1''tuple1'を連結( + ing)してsetを作成しようとすると、エラーが発生します。コード:

set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1

いくつかの型( intstring )は+両方使うが、

b = 400 + 'foo'

あるいは、何にも使われないかもしれません。

c = ["a","b"] - [1,2]

しかし、例えば、 floatint追加することができます:

d = 1 + 1.0

TypeError: '???'オブジェクトはiterable / subscriptableではありません:

オブジェクトを反復可能にするには、ゼロから開始してインデックスがもはや有効でなくなり、 IndexErrorが発生するまで、連続したインデックスを取ることができます(技術的には__iter__を返す__getitem__メソッドを持た__getitem__ばなりませ__iterator__ 、または__getitem__以前述べたもの)。

ここでは、 barは1の0番目の項目だと言っていbar 。ナンセンス:

foo = 1
bar = foo[0]

もっと離散したバージョンです:この例forxamount[0]に設定しようとしていますが、iterableの最初の項目ですが、amountはintなのでできません:

amount = 10
for x in amount: print(x)

TypeError: '???'オブジェクトは呼び出し可能ではありません

変数を定義して後で呼び出す(関数やメソッドで行うことのように)

foo = "notAFunction"
foo()

NameError:名前 '???'定義されていません

初期化されていない変数、メソッド、関数を使用しようとしたときに発生します(少なくとも以前はありません)。つまり、要求されたローカル名またはグローバル名が見つからない場合に発生します。オブジェクトの名前を間違えたり、何かをimportするのを忘れた可能性があります。それは別の範囲にあるかもしれません。別の例でそれらをカバーします。


それは単にコードのどこにも定義されていません

あなたが初期化するのを忘れている可能性があります、特にそれが定数の場合

foo   # This variable is not defined
bar() # This function is not defined

多分それは後で定義されるでしょう:

baz()

def baz():
    pass

それとも、 importされていない:

#needs import math

def sqrt():
    x = float(input("Value: "))
    return math.sqrt(x)

PythonスコープとLEGBルール:

いわゆるLEGBルールは、Pythonのスコープについて語ります。それは異なるスコープに基づいており、特権の優先順位によって順序付けられています。

Local → Enclosed → Global → Built-in.
  • L ocal:グローバルに宣言されていないか、関数に代入されていない変数。
  • E nclosing:別の関数の中にラップされた関数で定義された変数。
  • G lobal:グローバルに宣言された変数、またはファイルの最上位に割り当てられた変数。
  • B uilt-in:組み込みの名前モジュールにあらかじめ割り当てられた変数。

例として:

for i in range(4):
    d = i * 2
print(d)

dはアクセス可能です。これは、 forループが新しいスコープをマークしないためですが、そうした場合、エラーが発生し、その動作は次のようになります。

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

PythonはNameError: name 'd' is not definedと言っていNameError: name 'd' is not defined

その他のエラー

AssertError

assertステートメントはほとんどすべてのプログラミング言語で存在します。あなたがするとき:

assert condition

または:

assert condition, message

これはこれと同じです:

if __debug__:
    if not condition: raise AssertionError(message)

アサーションにはオプションのメッセージを含めることができ、デバッグが終了したらアサーションを無効にすることができます。

:組み込み変数のデバッグは、通常の状況ではTrue、最適化が要求されるとFalse(コマンドラインオプション-O)です。 デバッグの割り当ては不正です。インタープリターが起動すると、組み込み変数の値が決定されます。

KeyboardInterrupt

ユーザーが割り込みキー、通常はCtrl + Cまたはdelキーを押したときに発生するエラー。

ZeroDivisionError

定義されていない1/0を計算しようとしました。数値の除数を見つけるには、次の例を参照してください。

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(div+1): #includes the number itself and zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(div+1): #includes the number itself and zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

forループがその値をx割り当てるため、 ZeroDivisionErrorが発生forます。代わりにそれが必要です:

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

良いコードの構文エラー

興味のない行を指し示すSyntaxErrorは、大部分の時間の前にその行の前に問題があることを示します(この例では括弧がありません)。

def my_print():
    x = (1 + 1
    print(x)

返品

  File "<input>", line 3
    print(x)
        ^
SyntaxError: invalid syntax

この問題の最も一般的な理由は、例に示されているように、カッコ/カッコの不一致です。

Python 3ではprintステートメントの主な警告が1つあります。

Python 3.x 3.0
 >>> print "hello world"
  File "<stdin>", line 1
    print "hello world"
                      ^
SyntaxError: invalid syntax

printステートメントはprint()関数に置き換えられているので、次のようにします。

print("hello world")  # Note this is valid for both Py2 & Py3


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow