SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.10~3.12の魅力:入門者も使いやすいf-string、ExceptionGroup、進化したエラーメッセージの機能を解説

Pythonの新機能を知ろう! 第4回

エラーメッセージが明確に、初心者もデバッグしやすく

 最後に、Python 3.10から各バージョンで実施されてきたエラーメッセージの改良について紹介します。

より的確になったエラーメッセージ[3.10]

 Python 3.10では、SyntaxError、IndentationError、NameError、AttributeErrorでより的確なエラーメッセージが出力されるようになっています。例えばSyntaxErrorですが、リストのようなコードはPython 3.9では以下のようなエラーメッセージが出力されていました。

error_messages_310.py(Python 3.9)
expected = {1: 1, 2: 2, 3: 3, 

a = func()
  File "error_messages_310.py", line 3
    a = func()
      ^
SyntaxError: invalid syntax

 「invalid syntax=不正な構文」と出力されるだけなので、具体的に何が悪いのか分かりません。しかも、ハット(^)の場所を見ても構文エラーには見えないのも問題です。Python 3.10では、このような不親切なエラーメッセージが改善され、「'{' was never closed=中かっこが閉じていない」と、より具体的になりました。

  File "error_messages_310.py", line 1
    expected = {1: 1, 2: 2, 3: 3, 
               ^
SyntaxError: '{' was never closed

エラーメッセージへのカラム位置出力[3.11]

 Python 3.11におけるエラーメッセージの改良は、エラー発生箇所のカラム位置が表示されるようになったことです。Python 3.10までは、ゼロ除算時のエラーは以下のように素っ気ないものでした。エラーの発生と内容は分かりますが、具体的にどの変数が問題だったかなどの情報は得られません。

error_messages_311.py(Python 3.10)
a = 1
b = 0
c = 1
print(a / b / c)
Traceback (most recent call last):
  File "error_messages_311.py", line 4, in <module>
    print(a / b / c)
ZeroDivisionError: division by zero

 Python 3.11では、エラーメッセージこそ同じですが、エラーの発生箇所がハット(^)で示されるので、この場合は変数bでの除算に問題があったことが分かります。

…略…
    print(a / b / c)
          ~~^~~
ZeroDivisionError: division by zero

改良されたNameErrorなどのエラーメッセージ[3.12]

 Python 3.12では、NameErrorやSyntaxError、ImportErrorが発生していた局面で、エラーメッセージの内容がより具体的で親切になりました。例えばPython 3.11までは、インポートしていないモジュールを使おうとすると以下のように表示されていました。

error_messages_312.py(Python 3.11)
print(sys.argv)
Traceback (most recent call last):
  File "error_messages_312.py", line 10, in <module>
    print(sys.argv)
          ^^^
NameError: name 'sys' is not defined

 'sys'が未定義ということですが、sysがモジュールであることが分かれば修正は容易です。これが、Python 3.12では以下のように親切になります。

error_messages_312.py(Python 3.11)
…略…
    print(sys.argv)
          ^^^
NameError: name 'sys' is not defined. Did you forget to import 'sys'?

 途中までは同じですが、「'sys'をimportするのを忘れてません?」と補足してくれます。これによって、知識があやふやな開発者でも「ああ、そうだった」とすぐに気付いて修正できるでしょう。また、インスタンス変数についても可能な限り推測を試みてくれます。例えば以下のリストのようなケースです。

error_messages_312.py(Python 3.11)
class C:
    def __init__(self):
        self.var = 1
    
    def method(self):
        self.bar = var

C().method()

 実行すると、methodメソッドの呼び出しでNameErrorとなりますが、「self.varじゃない?」というように補足してくれるので便利です。

Traceback (most recent call last):
  File "error_messages_312.py", line 12, in <module>
    C().method()
  File "error_messages_312.py", line 10, in method
    self.bar = var
               ^^^
NameError: name 'var' is not defined. Did you mean: 'self.var'?

 この他にありがちなコーディングミスとして、from ... import ...のfromとimportを逆にしてしまったりしたときのSyntaxError、importする名前空間が見つからないときのImportErrorに対して、それぞれ以下のようなエラーメッセージを出力してくれます。

import Counter from collections
^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
ImportError: cannot import name 'counter' from 'collections' (…/__init__.py). Did you mean: 'Counter'?

 これらの改善で、特に入門者にとって格段にデバッグしやすくなったといえるでしょう。

まとめ

 今回は、Python 3.10以降の新機能のうち、f-strings構文の機能強化、新しく導入されたExceptionGroupとTaskGroup、それに改良されたエラーメッセージを中心に紹介しました。

 Pythonでは、このように魅力的な機能強化や改良が各バージョンで施されています。より使い勝手のよい言語として成長し続けるPythonを、今後も追っていきたいものです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/18916 2024/01/31 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー