'NoneType' object has no attribute 'xxx'

Last Updated on 2025年7月28日

Pythonで開発をしていると高確率で遭遇するエラーが「'NoneType' object has no attribute 'xxx'」です。これは、何らかの属性(メソッドやプロパティ)にアクセスしようとした対象が None だったことが原因で発生するエラーです。初心者にとっては少し分かりづらく、原因を特定するまでに時間がかかることもあるため、本記事ではエラーの意味から原因、具体的な対処法までを丁寧に解説します。

目次

エラー内容

このエラーは、None という値に対して存在しない属性にアクセスしようとしたときに発生します。実行時に以下のようなメッセージが出力されます:

たとえば、次のようなコードがあるとします。

このとき、get_user_by_id() が該当ユーザーを見つけられず None を返した場合、user に対して .name を呼び出すことはできません。そのため、上記のような AttributeError が発生します。

原因

このエラーの本質的な原因は「None というオブジェクトには、属性もメソッドも存在しない」という Python の仕様にあります。
NoneType は Python における「何もない」を表す型であり、下記のようなタイミングでよく出現します。

1. 戻り値が None だった

2. dict.get() で存在しないキーを指定

3. 正規表現でマッチしなかった結果を使用

4. クラス内の属性を初期化し忘れた

このように、関数・辞書・正規表現・クラス設計などさまざまな箇所で、意図せず None が使われる可能性があるため注意が必要です。

対処法

このエラーに対処するためには、属性へアクセスする前に「そのオブジェクトが None でないか」を確認することが最も基本かつ確実な方法です。
以下に代表的な対処法を紹介します。

1. None チェックを挟む

2. try-except による例外処理

3. dict.get() のデフォルト値を使う

4. Python3.8以降の「ウォルラス演算子(:=)」を活用

5. 関数側で None を返さない工夫

関数や辞書など、データ取得処理を行う部分で None が返る可能性を排除できる設計にすれば、そもそもこのエラーは回避できます。

補足:よくあるケースと対策

1. DjangoやFlaskでのDBクエリ結果がNone

if user is not None: のチェックを入れる

2. 再代入忘れによる None 使用

→ get() の戻り値には要注意。常にデフォルト値を設定する癖を

3. 関数チェーンの中でNoneが混入

→ 一つずつ分けて None をチェックするか、try-exceptを活用

4. Pythonicな書き方(getattrの活用)

→ user が None の場合は getattr ではなく user is not None and getattr(user, 'name', '未設定') などで補う

5. テストコードでの落とし穴

→ モックやスタブの返り値にも None が混入していないか確認が必要

まとめ

'NoneType' object has no attribute 'xxx'」は、Pythonで最も頻出するエラーのひとつであり、None に対してメソッドやプロパティへアクセスしようとした場合に発生します。

本記事の要点:

  • None は何の属性も持たない特殊な型である
  • 関数や辞書の戻り値、オブジェクトのプロパティなどに None が含まれていないか確認が必要
  • is not None チェックや try-except によるエラーハンドリングが効果的
  • より安全なコードを書くには「設計時点で None を返さない構造」を意識することが重要

このエラーは「落ち着いて原因を探れば必ず解決できる」タイプのエラーです。スタックトレースをよく読み、None がどこで混入したのかを丁寧に追跡することが、バグ修正への近道です。Pythonの柔軟性を活かしながら、堅牢でわかりやすいコードを書く力を育てていきましょう。