5つのPythonエラーの説明(およびその修正方法)
Pythonには多くの種類のエラーがあります。あなたのPythonの旅がどの段階にあっても、これらのエラーの一つ以上に直面したことがあるでしょう。ある人には、自分のコードに何が間違っているのかを知るのが簡単かもしれませんが、他の人にはそうではないかもしれません。そのため、これらのエラーが何を意味するのかを説明しています。
5. インデントエラー
Pythonを全くの初心者として始める場合や、C/C++やJavaのような言語から移行してきた場合、これは最も一般的なエラーになるでしょう。Pythonでは、他の多くの言語で一般的な波括弧の代わりにインデンテーションを使用してブロックを定義します。「ブロック」とは、単一のユニットとして扱われるコードのセグメントを指します。条件ブロック、関数、またはループについて考えてみてください。
Pythonでは、ブロック内のすべての文は同じインデントレベルでなければなりません。インデントレベルが変わる(増加または減少する)と、ブロックの開始または終了を示します。Pythonは一貫したインデントに大きく依存しています。一貫性のないインデントはIndentationErrorを引き起こします。
このエラーに直面する一般的なシナリオは、コードをエディターにコピー&ペーストする時です。時には、異なるエディターがテキストをフォーマットする方法の違いによって、インデントがエディターごとに壊れることがあります。
for i in range(5):
print(i)
上記のコード行をコピーしている間に、インデントが崩れました。このコードを実行しようとすると、IndentationError が発生します。これを修正するには、ブロックの下でステートメントのインデントを一貫して行う必要があります。
for i in range(5):
print(i)
このエラーに関連して直面する可能性のある別の問題は、タブとスペースの使用です。一部のエディタはタブを使用し、他のエディタはインデントに4つのスペースを使用します。コード内でこれらを混合すると、エラーが発生します。これは、どの行にタブが含まれているのか、どの行にスペースが含まれているのかを目に見える形で判断するのが難しいため、さらに混乱を招くものです。
4. 文法エラー
すべてのプログラミング言語には構文があります。言い換えれば、その言語でコードを書くために従わなければならない一連のルールです。したがって、これらのルールのいずれかを破ると、その言語はあなたが何をしようとしているのか理解できず、構文エラーを返します。
Pythonでは、インタープリタがPythonのルールに従っていないコードを見つけたときにSyntaxErrorが発生します。これは、コードがPythonが理解または実行できない形式になっていることを意味します。SyntaxErrorは、プログラムが開始することさえ妨げます。Pythonで直面する最も一般的な構文エラーのいくつかは次のとおりです:
- コードブロック(条件文、ループ、関数など)を開始するときにコロン(:)を忘れるなど、句読点が欠けている。
- Pythonのキーワードを誤綴りしたり誤って配置すること(
elseの代わりにesleを書く、発生すべきでない場所でbreak文を使用すること。) - 予約されたキーワードを変数名として使用する。
- 演算子の誤用(文中で等号演算子(==)を使うべきところで代入演算子(=)を使うこと。)
- 括弧を閉じるのを忘れたり、引用符を閉じるのを忘れたりすること。これは、複数の式を操作していて、それらが入れ子の括弧の中にあるときによく起こります。
良い知らせは、Pythonインタプリタがあなたが犯した文法エラーのタイプを特定し、行番号やエラーの大体の位置を指摘するのに十分賢いことです。ただし、時々エラーメッセージが少し曖昧で、正確な原因を反映しないことがあります。良いコードエディタやIDEを使用している場合、エラーとその修正の可能性を提案してくれることがあります。
3. インデックスエラー
Pythonは、リスト、タプル、セットなど、いくつかの組み込みデータ構造を提供しています。これらのデータ構造を反復処理し、要素にアクセスする必要があることがよくあります。すべてのデータ構造にはインデックスと呼ばれるものが含まれており、これはその構造内の特定の要素の位置です。
numbers = [1, 2, 3]
ここでは、numbersというリストがあります。リストの要素にアクセスする方法は、次のようにインデックスを使用します:
print(numbers[1]) # prints 2
IndexErrorは、データ構造(シーケンスとも呼ばれます)の要素に、有効なインデックス範囲外のインデックスでアクセスしようとしたときによく発生します。Pythonを含む多くのプログラミング言語では、インデックスはゼロから始まります。したがって、シーケンスにN個の要素が含まれている場合、インデックスの範囲は0からN-1です。
プログラマーはしばしばこのゼロベースのインデックスケースを扱うのを忘れ、オフバイワンエラーに陥り、インデックスエラーを引き起こします。インデックスエラーを避けるためには、常にシーケンスの長さを測定してください。
if index < len(my_list):
# execute code
シーケンスを反復処理する際、多くのプログラマーが犯す一般的なPythonの間違いは、それを変更することです。これもインデックスエラーを引き起こします。したがって、それを避けるようにしてください。
2. 値エラー
Pythonは多くのデータ型を提供しています。異なるデータ型で作業する際には、異なるリテラル値を扱う必要があります。時には、それらを関数の引数として使用することもあります。私たちが知っておくべきことは、すべての関数が引数として期待されるデータの型を持っているということです。そのデータを受け取る際、関数は受け取った値が有効であるかどうかもチェックします。
これがPythonにおけるValueErrorを引き起こします。これは、関数または操作が正しいデータ型を持つ引数を受け取るが、その値が不適切であるときに発生する組み込みの例外です。これは、引数の型は受け入れ可能ですが、その特定の値が実行されている操作に対して無効であることを意味します。
このよくあるケースは、あるデータ型を別のデータ型に変換したいときです。
int('10')
これは文字列 '10' を整数 10 に変換します。しかし、これを行うと:
int('ten')
値エラーが発生します。それは、int()関数が文字列データ型の引数を期待しているからです。しかし、その文字列の値は数字で構成されている必要があります。それが理由で「ten」は受け入れられない値です。同様に、数学的操作を行うときにもこのエラーが発生することがあります。
import math
math.sqrt(-5)
sqrt() 関数は正の数を期待しています。したがって、引数として負の数を指定すると、値エラーが発生します。値エラーに直面するもう一つの一般的なシナリオは、ユーザー入力を受け取るときです。ユーザーが入力できるものを制御できないため、間違った値を入力するとエラーが発生します。
ValueErrorを扱う最良の方法は、try-exceptブロックを使用することです。
try:
num = input("Enter a number: ")
num_int = int(num)
except ValueError as e:
print(f"Caught a ValueError: {e}")
このようにして、ユーザーが間違った値を入力してもプログラムのクラッシュを防ぐことができます。
1. 属性エラー
AttributeErrorは、特定のオブジェクトに存在しない属性やメソッドにアクセスしようとしたときに発生するPythonの一般的な例外です。簡単に言うと、オブジェクトに対して、そのオブジェクトが設計されていないことをさせようとしているということです。
文字列、リスト、またはカスタムクラスを扱っているとき、異なるデータ型の間で切り替える際に、オブジェクトが特定のプロパティや機能を持っていると簡単に想定してしまいます。しかし、Pythonは利用できない属性を呼び出そうとした瞬間にAttributeErrorを発生させます。
text = "hello world"
print(text.push())
文字列にはpush()メソッドがありません。したがって、上記の例では、属性エラーが発生します。もう一つの例を示します:
user = None
print(user.name)
NoneTypeオブジェクトの'name'属性にアクセスしようとすると、同様のエラーが発生します。これらのすべてのケースにおいて、あなたが作業しているオブジェクトは、アクセスしようとしている属性をサポートしていません。このエラーがプログラムの実行を中断しないように、オブジェクトの型を確認することを検討してください。
type(obj) # or
isinstance()
dir() 関数は、オブジェクトに対して利用できるすべての有効な属性とメソッドを明らかにします。この関数をオブジェクトに使用することで、利用可能な属性が何であるかを知ることができます。
Pythonは簡単な言語であるため、言語の基本を学ぶのは非常に簡単です。一般的なエラーについて知ったので、それらをデバッグし、心配せずによりPythonicなコードを書くことができるでしょう。




