Python Language
連邦の例外
サーチ…
前書き
ここでスタックオーバーフローでは、同じエラーについて重複していることがよく"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:予期しないインデント
この例外は、インデントレベルが増加し、理由がない場合に発生します。
例
ここでレベルを上げる理由はありません。
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
ここには2つのエラーがあります。最後のものとインデントがインデントレベルに一致しないことです。ただ1つしか表示されません:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
IndentationError / SyntaxError:インデントが外側のインデントレベルと一致しません
あなたは完全に内反していないように見えます。
例
def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"
print("This line is ok")
print("This line isn't ok")
IndentationError:インデントされたブロックが必要です
コロン(そして新しい行)の後、インデントレベルが増加しなければなりません。このエラーは発生しなかった場合に発生します。
例
if ok:
doStuff()
注 :キーワードを使用しpass
単に置くために(それは絶対に何も行いません) if
、 else
、 except
、 class
、 method
または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
ではお勧めできません。
- インデント用に4つのスペースを使用するようにエディタを設定します。
- 検索と置換を行い、すべてのタブを4つのスペースに置き換えます。
- エディターがタブを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
いくつかの型( int
やstring
)は+
両方使うが、
b = 400 + 'foo'
あるいは、何にも使われないかもしれません。
c = ["a","b"] - [1,2]
しかし、例えば、 float
をint
追加することができます:
d = 1 + 1.0
TypeError: '???'オブジェクトはiterable / subscriptableではありません:
オブジェクトを反復可能にするには、ゼロから開始してインデックスがもはや有効でなくなり、 IndexError
が発生するまで、連続したインデックスを取ることができます(技術的には__iter__
を返す__getitem__
メソッドを持た__getitem__
ばなりませ__iterator__
、または__getitem__
以前述べたもの)。
例
ここでは、 bar
は1の0番目の項目だと言っていbar
。ナンセンス:
foo = 1
bar = foo[0]
もっと離散したバージョンです:この例for
はx
をamount[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
を計算しようとしました。数値の除数を見つけるには、次の例を参照してください。
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
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
ます。代わりにそれが必要です:
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
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つあります。
>>> 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