[Python] エラー対応 – Subscript for class “list” will generate runtime exception; enclose type annotation in quotes

Pythonは動的型付け言語であるため、変数や関数の引数の型が実行時まで決定されません。しかし、Python3.5以降では型ヒントが導入され、開発者はコードの可読性や安全性を向上させることができます。型ヒントは、関数の引数や返り値の型を示すために使用されます。

エラー内容

VSCode上で赤波線が出る事がある。

Subscript for class “list” will generate runtime exception; enclose type annotation in quotes

このエラーメッセージは、Pythonのコードでリスト(list)のクラスに対してサブスクリプトを使用しようとした際に発生する可能性があります。サブスクリプトは通常、リストの要素にアクセスするために使用されますが、型注釈として使用する場合、クォートで囲むことが必要です。

例えば、次のようなコードがエラーを引き起こす可能性があります:

# エラーが発生する例 
my_list: list[int] = [1, 2, 3]

このコードでは、Pythonのバージョンによってはエラーが発生します。エラーの原因は、list に対してサブスクリプト(int)を使用しているためであり、これは正確な型注釈とは見なされません。この場合、型注釈をクォートで囲むことでエラーを回避できます。

正しい書き方は次の通りです:

# 正しい例 
my_list: 'list[int]' = [1, 2, 3]

このようにすることで、型注釈が正しく解釈され、エラーが回避されます。この変更により、ランタイムでの例外が発生することなく、正しい型情報が提供されます。

対応

enclose type annotation in quotes

と指示がある通り、ダブルクオーテーションで該当部分を囲って上げると解消する。

と言っても、このまま動作させても私の環境では想定どおりの動作をしてくれるので放置していましたが、そのまま残して置くのも気持ち悪かったので直しておきました。

クォートで型ントを囲む理由

クォートで型ヒントを囲む方法は、主に次の2つの理由から使用されます。

  1. 循環インポートの問題を回避するため
  2. 未来のアノテーションをサポートするため

循環インポートの問題を回避するため

循環インポートは、2つのモジュールが互いに他方をインポートする場合に発生します。これは、実行時にエラーや予期しない挙動を引き起こす可能性があります。クォートで型ヒントを囲むことで、この問題を回避できます。

未来のアノテーションをサポートするため

Python 3.7では、from __future__ import annotationsを使用することで、すべての型ヒントが自動的に文字列として評価されるようになります。これにより、クォートを使用せずに型ヒントを指定することが可能になります。しかし、Python 3.7未満のバージョンでの互換性を維持するために、型ヒントをクォートで囲むことが推奨されます。

 

この方法を使用することで、Pythonコードの可読性と安全性が向上し、互換性も維持されます。

型ヒントをクォートで囲む方法を活用して、Pythonプロジェクトの品質を向上させましょう。そして、自分のコードの可読性と安全性を向上させることで、より良いソフトウェア開発に貢献できるでしょう。