Pyright(Pylance)のtype check ruleの設定全部解説する: その1

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
Kazuki Moriyama (森山 和樹)

この記事で解説すること

Pythonの型チェックツールPyrightは設定によって静的型解析の挙動を変えることができる。
具体的には以下のページにある「Type Check Diagnostics Settings
」の値をいじる。

https://github.com/microsoft/pyright/blob/main/docs/configuration.md#type-check-diagnostics-settings

またPylance(マイクロソフトによって提供されているVisual Studio Code向けのPythonプラグイン)の型検査部分も以下のページに有るようにPyrightと同じなので、同じ設定値を使うことになる。

https://github.com/microsoft/pylance-release/blob/main/DIAGNOSTIC_SEVERITY_RULES.md

この記事では各ルールによって型検査の挙動がどう変わるか、どの様に型エラーを修正すればよいかを解説する。

そもそもPyrightとは

Pythonの型チェックツール。
コードに付いた型アノテーションを元に静的解析(コードを実際に動作させることなく検査すること)して、プログラムの欠陥を発見するツール。

Pythonの型チェックツールはmypyなど他にもある。
だがVisual Studio CodeのPythonプラグインであるPylanceの型チェックの部分はPyrightなので、Pyrightのシェアも増えていくと考えられる。

使用するツールのバージョン

ツール バージョン
Python 3.11.6
Pyright 1.1.341

各ルール解説

前準備

各サンプルコードではreveal_typeを使って型チェッカーが実際に型をどの様に推論しているかをデバッグする。
以下の様にしてreveal_typeはimportできる。

from typing import reveal_type

strictListInference

概要

strictListInference は、リストの型推論において厳格な型を使用するかどうかを制御する設定だ。この設定が true になっている場合、リスト内の異なる型の要素からより詳細なユニオン型を推論する。たとえば、[1, 'a', 3.4] というリストは list[int | str | float] と推論される。逆に、この設定が false(デフォルト値)の場合は、同じリストがより一般的な list[Any] として推論される可能性がある。

設定値ごとの挙動

  • strictListInference: true
    • リスト内の各要素の具体的な型を基に厳密な型推論を行う。
    • リスト [1, 'a', 3.4]list[int | str | float] と推論される。
  • strictListInference: false
    • リストの型推論が一般的に行われ、要素の具体的な型は考慮されない。
    • リスト [1, 'a', 3.4]list[Any] と推論される可能性がある。

サンプルコード

  • strictListInference: true の場合

    mixed_list = [1, 'a', 3.4]
    reveal_type(mixed_list)  # list[int | str | float] と推論される
    
  • strictListInference: false の場合

    mixed_list = [1, 'a', 3.4]
    reveal_type(mixed_list)  # list[Any] と推論される可能性がある
    

型エラーとその解決策

型エラーが発生する場合は、リスト内の要素が予期される型と一致しないときだ。strictListInferencetrue の場合、型エラーを解決するにはリスト内の要素の型が一貫性を持つように修正する必要がある。

たとえば、リストが list[int | str] と推論される場合、すべての要素が int または str 型である必要がある。それ以外の型の要素がある場合、型エラーが発生する。このようなエラーを修正するためには、リスト内の要素を適切な型に変更するか、リストの型注釈を変更する。

strictDictionaryInference

概要

strictDictionaryInference は、辞書のキーと値の型推論において、厳格な型推論を使用するかどうかを決定する設定である。この設定が true になっている場合、辞書内の異なる型の値からより詳細なユニオン型を推論する。例えば、辞書 {'a': 1, 'b': 'a'}dict[str, int | str] と推論される。逆に、この設定が false の場合は、同じ辞書が dict[str, Any] として推論される可能性がある。

設定値ごとの挙動

  • strictDictionaryInference: true

    • 辞書内の値の具体的な型を基に厳密な型推論を行う。
    • 辞書 {'a': 1, 'b': 'a'}dict[str, int | str] と推論される。
  • strictDictionaryInference: false

    • 辞書の型推論が一般的に行われ、値の具体的な型は考慮されない。
    • 辞書 {'a': 1, 'b': 'a'}dict[str, Any] と推論される可能性がある。

サンプルコード

  • strictDictionaryInference: true の場合

    mixed_dict = {'a': 1, 'b': 'a'}
    reveal_type(mixed_dict)  # dict[str, int | str] と推論される
    
  • strictDictionaryInference: false の場合

    mixed_dict = {'a': 1, 'b': 'a'}
    reveal_type(mixed_dict)  # dict[str, Any] と推論される可能性がある
    

型エラーとその解決策

strictDictionaryInferencetrue の場合、辞書内の値が予期される型と一致しないときに型エラーが発生する可能性がある。型エラーを解決するには、辞書内の値の型が一貫性を持つように修正するか、辞書の型注釈を適切に設定する必要がある。

例えば、辞書が dict[str, int] と推論される場合、すべての値が int 型である必要がある。str などの他の型の値が含まれている場合、型エラーが発生する。このようなエラーを修正するためには、辞書内の値を適切な型に変更する。

了解だ。指摘された点に注意して、strictSetInference ルールについての説明を修正し、翻訳する。

strictSetInference

概要

strictSetInference は、セットの型推論において厳格な型推論を使用するかどうかを制御する設定である。この設定が true になっている場合、セット内の異なる型の要素からより詳細なユニオン型を推論する。例えば、セット {1, 'a', 3.4}set[int | str | float] と推論される。逆に、この設定が false の場合は、同じセットが set[Any] として推論される可能性がある。

設定値ごとの挙動

  • strictSetInference: true

    • セット内の各要素の具体的な型を基に厳密な型推論を行う。
    • セット {1, 'a', 3.4}set[int | str | float] と推論される。
  • strictSetInference: false

    • セットの型推論が一般的に行われ、要素の具体的な型は考慮されない。
    • セット {1, 'a', 3.4}set[Any] と推論される可能性がある。

サンプルコード

  • strictSetInference: true の場合

    mixed_set = {1, 'a', 3.4}
    reveal_type(mixed_set)  # set[int | str | float] と推論される
    
  • strictSetInference: false の場合

    mixed_set = {1, 'a', 3.4}
    reveal_type(mixed_set)  # set[Any] と推論される可能性がある
    

型エラーとその解決策

strictSetInferencetrue の場合、セット内の要素が予期される型と一致しないときに型エラーが発生する可能性がある。型エラーを解決するには、セット内の要素の型が一貫性を持つように修正するか、セットの型注釈を適切に設定する必要がある。

例えば、セットが set[int | str] と推論される場合、すべての要素が int または str 型である必要がある。それ以外の型の要素が含まれている場合、型エラーが発生する。このようなエラーを修正するためには、セット内の要素を適切な型に変更する。

analyzeUnannotatedFunctions

概要

analyzeUnannotatedFunctions: boolean

analyzeUnannotatedFunctions は、入力パラメーターや戻り値に型注釈がない関数やメソッドに対して型チェックを行い、潜在的な型エラーを報告するかどうかを決定する設定である。この設定が true(デフォルト値)の場合、型注釈がない関数やメソッドでも型チェックが行われ、型エラーが検出される可能性がある。false に設定されている場合、型注釈がない関数やメソッドは型チェックの対象外となるが、型注釈がないこと自体は警告やエラーとして報告されない。

設定値ごとの挙動

  • analyzeUnannotatedFunctions: true

    • 型注釈がない関数やメソッドでも型チェックを行い、潜在的な型エラーを報告する。
  • analyzeUnannotatedFunctions: false

    • 型注釈がない関数やメソッドは型チェックの対象外となり、警告やエラーは報告されない。

サンプルコード

  • analyzeUnannotatedFunctions: true の場合

    def add(a, b):
        return a + b
    
    # 型注釈がなくても、Pyrightはこの関数を分析し、潜在的な型エラーを報告する
    
  • analyzeUnannotatedFunctions: false の場合

    def add(a, b):
        return a + b
    
    # 型注釈がないが、Pyrightはこの関数の型チェックを行わず、警告やエラーも報告しない
    

型エラーとその解決策

analyzeUnannotatedFunctionstrue の場合、型注釈がない関数やメソッドで潜在的な型エラーが検出される。ただしこの設定如何によらず型安全性を高めるためには、関数やメソッドに適切な型注釈を追加することが推奨される。

strictParameterNoneValue

概要

strictParameterNoneValue: boolean

strictParameterNoneValue は、PEP 484に基づいて関数のパラメータがデフォルト値として None を持つ場合、その型を暗黙的に Optional とするかどうかを決定する設定である。この設定が true の場合、明示的に Optional 型をパラメータの型注釈として使用する必要がある。デフォルト値は true である。

設定値ごとの挙動

  • strictParameterNoneValue: true

    • デフォルト値が None の関数パラメータには、明示的に Optional 型注釈を使用する。
  • strictParameterNoneValue: false

    • デフォルト値が None でも、パラメータの型注釈に Optional を明示的に使用する必要はない。

サンプルコード

  • strictParameterNoneValue: true の場合

    def greet(name: str = None):
        return f"Hello, {name}"
    
    # この関数は、nameがNoneを許容するため、型注釈として `Optional[str]` を使用すべき
    
  • strictParameterNoneValue: false の場合

    def greet(name: str = None):
        return f"Hello, {name}"
    
    # Optionalを使用しなくても型エラーは発生しない
    

型エラーとその解決策

strictParameterNoneValuetrue の場合、デフォルト値が None のパラメータには、型注釈として Optional を明示的に使用する必要がある。そうでないと型エラーが発生する。型エラーを解決するためには、パラメータの型注釈を Optional[型] に変更する。

  • 型エラーを修正するための関数(Optional 型注釈を追加):
    from typing import Optional
    
    def greet(name: Optional[str] = None):
        return f"Hello, {name}"
    
    # `Optional[str]` を使用して、nameが `str` 型か `None` かを明示する
    

enableTypeIgnoreComments

概要

enableTypeIgnoreComments: boolean

enableTypeIgnoreComments は、PEP 484で定義された "# type: ignore" コメントのサポートを有効化または無効化する設定である。このコメントは、特定の行の型チェックを無視するために使用される。この設定が true の場合、"# type: ignore" コメントが有効となり、Pyrightはこれらのコメントがある行の型チェックを行わない。デフォルト値は true である。この設定は "# pyright: ignore" コメントには影響しない。

設定値ごとの挙動

  • enableTypeIgnoreComments: true

    • "# type: ignore" コメントが有効であり、これらのコメントがある行の型チェックは無視される。
  • enableTypeIgnoreComments: false

    • "# type: ignore" コメントは無効であり、コメントがあっても型チェックは行われる。

サンプルコード

  • enableTypeIgnoreComments: true の場合

    a: int = "this is a string"  # type: ignore
    # この行は型チェックから除外される
    
  • enableTypeIgnoreComments: false の場合

    a: int = "this is a string"  # type: ignore
    # このコメントは無視され、型エラーが報告される
    

型エラーとその解決策

enableTypeIgnoreCommentstrue の場合、"# type: ignore" コメントがある行は型チェックから除外されるため、型エラーは発生しない。false の場合、これらのコメントは無効となり、通常通り型エラーが報告される。したがって、ignoreができないときには脱出口的にこの機能を使うのではなく、自身で型が合うようにコードを修正する必要がある。

deprecateTypingAliases

概要

deprecateTypingAliases: boolean

deprecateTypingAliases は、PEP 585に基づき、Python 3.9以降で標準コレクションの型に対するエイリアスが非推奨とされるかどうかを制御する設定である。Python 3.9以降では、ジェネリクスをサポートするために導入された typing モジュールの型エイリアス(例えば typing.List 代わりに list)が非推奨となる。この設定はPython 3.9以降でのみ適用される。デフォルト値は false だが、将来的に true に変更される可能性がある。

設定値ごとの挙動

  • deprecateTypingAliases: true

    • Python 3.9以降で typing モジュールの型エイリアスは非推奨と扱われる。
  • deprecateTypingAliases: false

    • Python 3.9以降でも typing モジュールの型エイリアスは非推奨とは扱われない。

サンプルコード

  • deprecateTypingAliases: true の場合

    from typing import List
    a: List[int] = [1, 2, 3]
    # List[int] は非推奨として扱われる
    
  • deprecateTypingAliases: false の場合

    from typing import List
    a: List[int] = [1, 2, 3]
    # List[int] は非推奨として扱われない
    

型エラーとその解決策

deprecateTypingAliasestrue の場合、非推奨とされる typing モジュールの型エイリアスを使用すると警告が出る可能性がある。これを解決するには、Python 3.9以降の標準コレクションの型(list, dict, set など)を直接使用する。

  • 非推奨の型エイリアスを修正するためのサンプルコード:
    a: list[int] = [1, 2, 3]
    # Python 3.9以降では list[int] が推奨される
    

enableExperimentalFeatures

概要

enableExperimentalFeatures: boolean

enableExperimentalFeatures は、Pythonの型付け標準に対する提案されたり探索的な変更に対応する、実験的な(主に未文書化の)機能群を有効化するかどうかを制御する設定である。これらの機能は将来的に変更されたり削除される可能性が高いため、実験目的以外での使用は推奨されない。デフォルト値は false である。

設定値ごとの挙動

  • enableExperimentalFeatures: true

    • 実験的な機能が有効化される。これらの機能は未文書化であり、将来的に変更される可能性がある。
  • enableExperimentalFeatures: false

    • 実験的な機能は無効化される。

サンプルコード

enableExperimentalFeaturestrue または false の場合の具体的なサンプルコードは提供できない。これは、実験的な機能が主に未文書化であり、その具体的な挙動が明確に定義されていないためである。この設定は主に開発者が新しい型付け機能を試すために使用される。

実験的な機能の使用に関する注意

enableExperimentalFeaturestrue に設定する場合は、その機能が実験的であり、将来的に変更される可能性があることを理解し、実験目的以外での使用は控えるべきである。安定したアプリケーションやライブラリでの使用は推奨されない。

disableBytesTypePromotions

概要

disableBytesTypePromotions: boolean

disableBytesTypePromotions は、bytearraymemoryviewbytes のサブタイプと見なされるという従来の挙動を無効化する設定である。PEP 688では、この挙動が非推奨とされているが、このスイッチを使用することで、古い挙動を復元できる。デフォルト値は false である。

設定値ごとの挙動

  • disableBytesTypePromotions: true

    • bytearraymemoryviewbytes のサブタイプとして扱われる従来の挙動を無効化する。
  • disableBytesTypePromotions: false

    • bytearraymemoryviewbytes のサブタイプとして扱われる。

サンプルコード

  • disableBytesTypePromotions: true の場合

    a: bytes = bytearray(b"example")
    # `bytearray` は `bytes` のサブタイプとして扱われないため、型エラーが発生する
    
  • disableBytesTypePromotions: false の場合

    a: bytes = bytearray(b"example")
    # `bytearray` は `bytes` のサブタイプとして扱われるため、型エラーは発生しない
    

型エラーとその解決策

disableBytesTypePromotionstrue の場合、bytearraymemoryviewbytes 型として扱うと型エラーが発生する。これを解決するには、変数の型を bytearraymemoryview など、実際の型に合わせて変更する必要がある。

reportPropertyTypeMismatch

概要

reportPropertyTypeMismatch: boolean or string

reportPropertyTypeMismatch は、セッターに渡された値の型がゲッターによって返された値の型に割り当てられない場合の診断を生成または抑制する設定である。このような不一致は、プロパティの意図された使用法に反する。プロパティは変数のように振る舞うことが意図されている。デフォルト値は "none" である。

設定値ごとの挙動

  • reportPropertyTypeMismatch: true or "error"

    • セッターとゲッターの型不一致に対して診断を生成する。
  • reportPropertyTypeMismatch: false or "none"

    • セッターとゲッターの型不一致に対する診断を抑制する。

サンプルコード

  • reportPropertyTypeMismatch: true の場合

    class Example:
        @property
        def value(self) -> int:
            return 42
    
        @value.setter
        def value(self, v: str):
            pass
    # セッターの型(str)がゲッターの型(int)と一致しないため、型エラーが報告される
    
  • reportPropertyTypeMismatch: false の場合

    class Example:
        @property
        def value(self) -> int:
            return 42
    
        @value.setter
        def value(self, v: str):
            pass
    # 型不一致の診断は抑制される
    

型エラーとその解決策

reportPropertyTypeMismatchtrue または "error" の場合、セッターの型とゲッターの型が一致しないと型エラーが報告される。このエラーを解決するには、セッターとゲッターの型を一致させる必要がある。

  • 型エラーを修正するためのサンプルコード:
    class Example:
        @property
        def value(self) -> int:
            return 42
    
        @value.setter
        def value(self, v: int):
            pass
    # セッターとゲッターの型が一致しているため、型エラーは発生しない
    

reportFunctionMemberAccess

概要

reportFunctionMemberAccess: boolean or string

reportFunctionMemberAccess は、関数に対する非標準メンバーアクセスに関する診断を生成または抑制する設定である。非標準メンバーアクセスとは、関数オブジェクトに対して通常想定されていない属性やメソッドへのアクセスを指す。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportFunctionMemberAccess: true or "error"

    • 関数に対する非標準メンバーアクセスに対してエラーを生成する。
  • reportFunctionMemberAccess: false or "none"

    • 関数に対する非標準メンバーアクセスの診断を抑制する。

サンプルコード

  • reportFunctionMemberAccess: true の場合

    def example_function():
        pass
    
    print(example_function.fake_attribute)
    # 非標準のメンバーアクセスに対してエラーが生成される
    
  • reportFunctionMemberAccess: false の場合

    def example_function():
        pass
    
    print(example_function.fake_attribute)
    # 非標準のメンバーアクセスに対する診断は抑制される
    

型エラーとその解決策

reportFunctionMemberAccesstrue または "error" の場合、関数に対する非標準メンバーアクセスによって型エラーが報告される。このエラーを解決するには、関数オブジェクトに対する不適切なメンバーアクセスを避ける必要がある。

reportMissingImports

概要

reportMissingImports: boolean or string

reportMissingImports は、対応するインポートされたPythonファイルや型スタブファイルが存在しないインポートに対する診断を生成または抑制する設定である。この設定は、存在しないモジュールをインポートしようとした場合にエラーを生成するかどうかを決定する。デフォルト値は "error" である。

設定値ごとの挙動

  • reportMissingImports: true or "error"

    • 対応するファイルが存在しないインポートに対してエラーを生成する。
  • reportMissingImports: false or "none"

    • 対応するファイルが存在しないインポートの診断を抑制する。

サンプルコード

  • reportMissingImports: true の場合

    import nonexistent_module
    # nonexistent_module が存在しないため、エラーが生成される
    
  • reportMissingImports: false の場合

    import nonexistent_module
    # 対応するファイルが存在しないインポートに対するエラーは抑制される
    

型エラーとその解決策

reportMissingImportstrue または "error" の場合、存在しないモジュールのインポートによって型エラーが報告される。このエラーを解決するには、正しいモジュール名を使用するか、必要なファイルがプロジェクト内に存在することを確認する必要がある。または、依存関係が正しくインストールされていることを確認する。

reportMissingModuleSource

概要

reportMissingModuleSource: boolean or string

reportMissingModuleSource は、インポートされたモジュールに対応するソースファイルが存在しない場合の診断を生成または抑制する設定である。これは、型スタブが見つかったが、モジュールのソースファイルが見つからない場合に発生する。これは、実行環境を使用して実行時にコードが失敗する可能性があることを示している。型チェックは型スタブを使用して行われる。デフォルト値は "warning" である。

設定値ごとの挙動

  • reportMissingModuleSource: true or "error"

    • 対応するソースファイルがないインポートに対してエラーを生成する。
  • reportMissingModuleSource: false or "none"

    • 対応するソースファイルがないインポートの診断を抑制する。

サンプルコード

  • reportMissingModuleSource: "warning" の場合

    import some_module
    # some_module のソースファイルが見つからないが、型スタブは見つかるため、警告が生成される
    
  • reportMissingModuleSource: false の場合

    import some_module
    # ソースファイルが見つからないインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportMissingModuleSourcetrue"error"、または "warning" の場合、対応するソースファイルがないインポートに対して警告またはエラーが報告される。この問題を解決するには、モジュールのソースファイルが存在することを確認するか、依存関係が正しくインストールされていることを確認する。または、必要に応じて型スタブのみを使用することを検討する。

reportMissingTypeStubs

概要

reportMissingTypeStubs: boolean or string

reportMissingTypeStubs は、対応する型スタブファイル(typeshedファイルまたはカスタム型スタブ)がないインポートに関する診断を生成または抑制する設定である。型チェッカーは、最適な分析を行うために型スタブを必要とする。デフォルト値は "none" である。この診断には、編集体験を向上させるためにカスタム型スタブを生成するための対応するクイックフィックスがあることに注意。

設定値ごとの挙動

  • reportMissingTypeStubs: true or "error"

    • 対応する型スタブがないインポートに対してエラーを生成する。
  • reportMissingTypeStubs: false or "none"

    • 対応する型スタブがないインポートの診断を抑制する。

サンプルコード

  • reportMissingTypeStubs: "warning" の場合

    import some_module
    # some_module の型スタブが見つからないため、警告が生成される
    
  • reportMissingTypeStubs: false の場合

    import some_module
    # 型スタブが見つからないインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportMissingTypeStubstrue"error"、または "warning" の場合、対応する型スタブがないインポートに対して警告またはエラーが報告される。この問題を解決するには、必要な型スタブファイルをプロジェクトに追加するか、型スタブを生成する。または、型スタブが必要ない場合は、この設定を "none" または false に設定して診断を抑制する。

reportImportCycles

概要

reportImportCycles: boolean or string

reportImportCycles は、循環インポートチェーンに関する診断を生成または抑制する設定である。Pythonでは循環インポートはエラーではないが、型分析の速度を低下させ、アーキテクチャの層の問題を示唆することが多い。一般的に、これらは避けるべきである。デフォルト値は "none" であり、この設定では、typeshedの標準ライブラリ型スタブファイルにあるインポートサイクルは無視される。

設定値ごとの挙動

  • reportImportCycles: true or "error"

    • 循環インポートチェーンに対してエラーを生成する。
  • reportImportCycles: false or "none"

    • 循環インポートチェーンの診断を抑制する。

サンプルコード

  • reportImportCycles: true or "error" の場合

    # file1.py
    from .file2 import some_function
    
    # file2.py
    from .file1 import another_function
    # 循環インポートが存在するため、エラーが生成される
    
  • reportImportCycles: false or "none" の場合

    # file1.py
    from .file2 import some_function
    
    # file2.py
    from .file1 import another_function
    # 循環インポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportImportCyclestrue または "error" の場合、循環インポートに対してエラーが報告される。この問題を解決するには、インポートの構造を変更して循環依存を避けるか、必要に応じてモジュールを再設計する。

reportUnusedImport

概要

reportUnusedImport: boolean or string

reportUnusedImport は、そのファイル内で参照されていないインポートされたシンボルに関する診断を生成または抑制する設定である。この設定は、使用されていないインポートに対する警告やエラーを管理するために使用される。デフォルト値は "none" である。

設定値ごとの挙動

  • reportUnusedImport: true or "error"

    • 使用されていないインポートに対してエラーを生成する。
  • reportUnusedImport: false or "none"

    • 使用されていないインポートの診断を抑制する。

サンプルコード

  • reportUnusedImport: true or "error" の場合

    import some_module
    # some_module はこのファイル内で使用されていないため、エラーが生成される
    
  • reportUnusedImport: false or "none" の場合

    import some_module
    # 使用されていないインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportUnusedImporttrue または "error" の場合、使用されていないインポートに対してエラーが報告される。この問題を解決するには、使用されていないインポートをファイルから削除する。

reportUnusedClass

概要

reportUnusedClass: boolean or string

reportUnusedClass は、プライベート名(アンダースコアで始まる名前)を持つクラスがアクセスされていない場合の診断を生成または抑制する設定である。この設定は、使用されていないプライベートクラスに対する警告やエラーを管理するために使用される。デフォルト値は "none" である。

設定値ごとの挙動

  • reportUnusedClass: true or "error"

    • 使用されていないプライベートクラスに対してエラーを生成する。
  • reportUnusedClass: false or "none"

    • 使用されていないプライベートクラスの診断を抑制する。

サンプルコード

  • reportUnusedClass: true or "error" の場合

    class _UnusedClass:
        pass
    # _UnusedClass はこのファイル内で使用されていないため、エラーが生成される
    
  • reportUnusedClass: false or "none" の場合

    class _UnusedClass:
        pass
    # 使用されていないプライベートクラスに対する警告やエラーは抑制される
    

型エラーとその解決策

reportUnusedClasstrue または "error" の場合、使用されていないプライベートクラスに対してエラーが報告される。この問題を解決するには、使用されていないプライベートクラスをファイルから削除するか、必要に応じてそのクラスを使用する。

reportUnusedFunction

概要

reportUnusedFunction: boolean or string

reportUnusedFunction は、プライベート名(アンダースコアで始まる名前)を持つ関数やメソッドがアクセスされていない場合の診断を生成または抑制する設定である。この設定は、使用されていないプライベート関数やメソッドに対する警告やエラーを管理するために使用される。デフォルト値は "none" である。

設定値ごとの挙動

  • reportUnusedFunction: true or "error"

    • 使用されていないプライベート関数やメソッドに対してエラーを生成する。
  • reportUnusedFunction: false or "none"

    • 使用されていないプライベート関数やメソッドの診断を抑制する。

サンプルコード

  • reportUnusedFunction: true or "error" の場合

    def _unused_function():
        pass
    # _unused_function はこのファイル内で使用されていないため、エラーが生成される
    
  • reportUnusedFunction: false or "none" の場合

    def _unused_function():
        pass
    # 使用されていないプライベート関数やメソッドに対する警告やエラーは抑制される
    

型エラーとその解決策

reportUnusedFunctiontrue または "error" の場合、使用されていないプライベート関数やメソッドに対してエラーが報告される。この問題を解決するには、使用されていないプライベート関数やメソッドをファイルから削除するか、必要に応じてその関数やメソッドを使用する。

reportUnusedVariable

概要

reportUnusedVariable: boolean or string

reportUnusedVariable は、アクセスされていない変数に関する診断を生成または抑制する設定である。この設定は、使用されていない変数に対する警告やエラーを管理するために使用される。デフォルト値は "none" であり、アンダースコアで始まる名前を持つ変数はこのチェックから免除される。

設定値ごとの挙動

  • reportUnusedVariable: true or "error"

    • 使用されていない変数に対してエラーを生成する。
  • reportUnusedVariable: false or "none"

    • 使用されていない変数の診断を抑制する。

サンプルコード

  • reportUnusedVariable: true or "error" の場合

    unused_var = 42
    # unused_var はこのファイル内で使用されていないため、エラーが生成される
    
  • reportUnusedVariable: false or "none" の場合

    unused_var = 42
    # 使用されていない変数に対する警告やエラーは抑制される
    

型エラーとその解決策

reportUnusedVariabletrue または "error" の場合、使用されていない変数に対してエラーが報告される。この問題を解決するには、使用されていない変数をファイルから削除するか、必要に応じてその変数を使用する。アンダースコアで始まる変数はこのチェックの対象外である。

reportDuplicateImport

概要

reportDuplicateImport: boolean or string

reportDuplicateImport は、同一のシンボルまたはモジュールが複数回インポートされた場合の診断を生成または抑制する設定である。この設定は、重複したインポートに対する警告やエラーを管理するために使用される。デフォルト値は "none" である。

設定値ごとの挙動

  • reportDuplicateImport: true or "error"

    • 同一のシンボルまたはモジュールが複数回インポートされた場合にエラーを生成する。
  • reportDuplicateImport: false or "none"

    • 重複したインポートの診断を抑制する。

サンプルコード

  • reportDuplicateImport: true or "error" の場合

    import os
    import os  # 重複したインポート
    # os モジュールが複数回インポートされているため、エラーが生成される
    
  • reportDuplicateImport: false or "none" の場合

    import os
    import os  # 重複したインポート
    # 重複したインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportDuplicateImporttrue または "error" の場合、重複したインポートに対してエラーが報告される。この問題を解決するには、重複したインポートを削除する。

reportWildcardImportFromLibrary

概要

reportWildcardImportFromLibrary: boolean or string

reportWildcardImportFromLibrary は、外部ライブラリからのワイルドカードインポート(from some_module import * の形式)に関する診断を生成または抑制する設定である。このような言語機能の使用は強く非推奨であり、ライブラリが更新された際にバグを引き起こす可能性がある。デフォルト値は "warning" である。

設定値ごとの挙動

  • reportWildcardImportFromLibrary: true or "error"

    • 外部ライブラリからのワイルドカードインポートに対してエラーを生成する。
  • reportWildcardImportFromLibrary: false or "none"

    • 外部ライブラリからのワイルドカードインポートの診断を抑制する。

サンプルコード

  • reportWildcardImportFromLibrary: "warning" の場合

    from some_external_library import *
    # 外部ライブラリからのワイルドカードインポートに対して警告が生成される
    
  • reportWildcardImportFromLibrary: false or "none" の場合

    from some_external_library import *
    # ワイルドカードインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportWildcardImportFromLibrarytrue"error"、または "warning" の場合、外部ライブラリからのワイルドカードインポートに対して警告またはエラーが報告される。この問題を解決するには、ワイルドカードインポートを避け、必要なシンボルを明示的にインポートする。これにより、コードの明確さと保守性が向上し、将来のライブラリ更新時の潜在的な問題を回避できる。

reportOptionalSubscript

概要

reportOptionalSubscript: boolean or string

reportOptionalSubscript は、Optional 型の変数をサブスクリプト(インデックスアクセス)しようとする試みに関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、サブスクリプト操作は TypeError を引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalSubscript: true or "error"

    • Optional 型の変数のサブスクリプト操作に対してエラーを生成する。
  • reportOptionalSubscript: false or "none"

    • Optional 型の変数のサブスクリプト操作の診断を抑制する。

サンプルコード

  • reportOptionalSubscript: true or "error" の場合

    from typing import Optional
    
    def get_item(optional_list: Optional[list], index: int):
        return optional_list[index]
    # optional_list が None の場合、エラーが生成される
    
  • reportOptionalSubscript: false or "none" の場合

    from typing import Optional
    
    def get_item(optional_list: Optional[list], index: int):
        return optional_list[index]
    # `Optional` 型の変数のサブスクリプト操作に対するエラーは抑制される
    

型エラーとその解決策

reportOptionalSubscripttrue または "error" の場合、Optional 型の変数のサブスクリプト操作に対してエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    def get_item(optional_list: Optional[list], index: int):
        if optional_list is not None:
            return optional_list[index]
        else:
            return None
    # `Optional` 型の変数が `None` でないことを確認してからサブスクリプト操作を行う
    

reportOptionalMemberAccess

概要

reportOptionalMemberAccess: boolean or string

reportOptionalMemberAccess は、Optional 型の変数のメンバーにアクセスしようとする試みに関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、メンバーアクセスは AttributeError を引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalMemberAccess: true or "error"

    • Optional 型の変数のメンバーアクセスに対してエラーを生成する。
  • reportOptionalMemberAccess: false or "none"

    • Optional 型の変数のメンバーアクセス操作の診断を抑制する。

サンプルコード

  • reportOptionalMemberAccess: true or "error" の場合

    from typing import Optional
    
    class MyClass:
        def method(self):
            pass
    
    def access_member(optional_object: Optional[MyClass]):
        optional_object.method()
    # optional_object が None の場合、エラーが生成される
    
  • reportOptionalMemberAccess: false or "none" の場合

    from typing import Optional
    
    class MyClass:
        def method(self):
            pass
    
    def access_member(optional_object: Optional[MyClass]):
        optional_object.method()
    # `Optional` 型の変数のメンバーアクセスに対するエラーは抑制される
    

型エラーとその解決策

reportOptionalMemberAccesstrue または "error" の場合、Optional 型の変数のメンバーアクセスに対してエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    class MyClass:
        def method(self):
            pass
    
    def access_member(optional_object: Optional[MyClass]):
        if optional_object is not None:
            optional_object.method()
        else:
            # 適切な処理またはエラーハンドリング
            pass
    # `Optional` 型の変数が `None` でないことを確認してからメンバーアクセスを行う
    

reportOptionalCall

概要

reportOptionalCall: boolean or string

reportOptionalCall は、Optional 型の変数を呼び出そうとする試み(関数やメソッドとして)に関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、呼び出しは TypeError を引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalCall: true or "error"

    • Optional 型の変数の呼び出しに対してエラーを生成する。
  • reportOptionalCall: false or "none"

    • Optional 型の変数の呼び出し操作の診断を抑制する。

サンプルコード

  • reportOptionalCall: true or "error" の場合

    from typing import Optional
    
    def maybe_callable() -> Optional[callable]:
        # 何らかの条件に基づいて callable または None を返す
        pass
    
    optional_func = maybe_callable()
    optional_func()
    # optional_func が None の場合、エラーが生成される
    
  • reportOptionalCall: false or "none" の場合

    from typing import Optional
    
    def maybe_callable() -> Optional[callable]:
        pass
    
    optional_func = maybe_callable()
    optional_func()
    # `Optional` 型の変数の呼び出しに対するエラーは抑制される
    

型エラーとその解決策

reportOptionalCalltrue または "error" の場合、Optional 型の変数の呼び出しに対してエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    def maybe_callable() -> Optional[callable]:
        pass
    
    optional_func = maybe_callable()
    if optional_func is not None:
        optional_func()
    else:
        # 適切な処理またはエラーハンドリング
        pass
    # `Optional` 型の変数が `None` でないことを確認してから呼び出しを行う
    

reportOptionalIterable

概要

reportOptionalIterable: boolean or string

reportOptionalIterable は、Optional 型の変数をイテラブル値として使用しようとする試み(例えば for 文内で)に関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、イテレーションは TypeError を引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalIterable: true or "error"

    • Optional 型の変数をイテラブルとして使用しようとする際にエラーを生成する。
  • reportOptionalIterable: false or "none"

    • Optional 型の変数をイテラブルとして使用する操作の診断を抑制する。

サンプルコード

  • reportOptionalIterable: true or "error" の場合

    from typing import Optional
    
    def get_optional_iterable() -> Optional[Iterable]:
        # 何らかの条件に基づいて Iterable または None を返す
        pass
    
    optional_iterable = get_optional_iterable()
    for item in optional_iterable:
        pass
    # optional_iterable が None の場合、エラーが生成される
    
  • reportOptionalIterable: false or "none" の場合

    from typing import Optional
    
    def get_optional_iterable() -> Optional[Iterable]:
        pass
    
    optional_iterable = get_optional_iterable()
    for item in optional_iterable:
        pass
    # `Optional` 型の変数をイテラブルとして使用する操作に対するエラーは抑制される
    

型エラーとその解決策

reportOptionalIterabletrue または "error" の場合、Optional 型の変数をイテラブルとして使用しようとする際にエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    def get_optional_iterable() -> Optional[Iterable]:
        pass
    
    optional_iterable = get_optional_iterable()
    if optional_iterable is not None:
        for item in optional_iterable:
            pass
    else:
        # 適切な処理またはエラーハンドリング
        pass
    # `Optional` 型の変数が `None` でないことを確認してからイテレーションを行う
    

reportOptionalContextManager

概要

reportOptionalContextManager: boolean or string

reportOptionalContextManager は、Optional 型の変数をコンテキストマネージャ(with 文のパラメータとして)として使用しようとする試みに関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、これをコンテキストマネージャとして使用すると AttributeError または TypeError を引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalContextManager: true or "error"

    • Optional 型の変数をコンテキストマネージャとして使用しようとする際にエラーを生成する。
  • reportOptionalContextManager: false or "none"

    • Optional 型の変数をコンテキストマネージャとして使用する操作の診断を抑制する。

サンプルコード

  • reportOptionalContextManager: true or "error" の場合

    from typing import Optional
    
    def get_optional_context_manager() -> Optional[ContextManager]:
        # 何らかの条件に基づいて ContextManager または None を返す
        pass
    
    optional_cm = get_optional_context_manager()
    with optional_cm:
        pass
    # optional_cm が None の場合、エラーが生成される
    
  • reportOptionalContextManager: false or "none" の場合

    from typing import Optional
    
    def get_optional_context_manager() -> Optional[ContextManager]:
        pass
    
    optional_cm = get_optional_context_manager()
    with optional_cm:
        pass
    # `Optional` 型の変数をコンテキストマネージャとして使用する操作に対するエラーは抑制される
    

型エラーとその解決策

reportOptionalContextManagertrue または "error" の場合、Optional 型の変数をコンテキストマネージャとして使用しようとする際にエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    def get_optional_context_manager() -> Optional[ContextManager]:
        pass
    
    optional_cm = get_optional_context_manager()
    if optional_cm is not None:
        with optional_cm:
            pass
    else:
        # 適切な処理またはエラーハンドリング
        pass
    # `Optional` 型の変数が `None` でないことを確認してからコンテキストマネージャとして使用する
    

reportOptionalOperand

概要

reportOptionalOperand: boolean or string

reportOptionalOperand は、Optional 型の変数を単項演算子(例えば ~not)や二項演算子(例えば *==or など)の左辺のオペランドとして使用しようとする試みに関する診断を生成または抑制する設定である。Optional 型の変数は None である可能性があり、演算子と組み合わせて使用すると予期しない結果やエラーを引き起こす可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOptionalOperand: true or "error"

    • Optional 型の変数を演算子のオペランドとして使用しようとする際にエラーを生成する。
  • reportOptionalOperand: false or "none"

    • Optional 型の変数を演算子のオペランドとして使用する操作の診断を抑制する。

サンプルコード

  • reportOptionalOperand: true or "error" の場合

    from typing import Optional
    
    optional_var: Optional[int] = None
    result = optional_var * 2
    # optional_var が None の場合、エラーが生成される
    
  • reportOptionalOperand: false or "none" の場合

    from typing import Optional
    
    optional_var: Optional[int] = None
    result = optional_var * 2
    # `Optional` 型の変数を演算子のオペランドとして使用する操作に対するエラーは抑制される
    

型エラーとその解決策

reportOptionalOperandtrue または "error" の場合、Optional 型の変数を演算子のオペランドとして使用しようとする際にエラーが報告される。この問題を解決するには、変数が None でないことを確認するか、Optional 型を避ける必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import Optional
    
    optional_var: Optional[int] = None
    if optional_var is not None:
        result = optional_var * 2
    else:
        # 適切な処理またはエラーハンドリング
        pass
    # `Optional` 型の変数が `None` でないことを確認してから演算子を使用する
    

reportTypedDictNotRequiredAccess

概要

reportTypedDictNotRequiredAccess: boolean or string

reportTypedDictNotRequiredAccess は、TypedDict 内の必須でないフィールドにアクセスしようとする試みに対する診断を生成または抑制する設定である。TypedDict では、特定のフィールドはオプショナル(必須でない)として定義できる。この設定が有効の場合、必須でないフィールドにアクセスする前にその存在を確認しなければエラーが生成される。デフォルト値は "error" である。

設定値ごとの挙動

  • reportTypedDictNotRequiredAccess: true or "error"

    • TypedDict の必須でないフィールドにアクセスしようとする際にエラーを生成する。
  • reportTypedDictNotRequiredAccess: false or "none"

    • TypedDict の必須でないフィールドへのアクセス操作の診断を抑制する。

サンプルコード

  • reportTypedDictNotRequiredAccess: true or "error" の場合

    from typing import TypedDict, Optional
    
    class ExampleDict(TypedDict, total=False):
        optional_field: Optional[int]
    
    example_dict = ExampleDict()
    value = example_dict['optional_field']  # エラーが生成される
    
  • reportTypedDictNotRequiredAccess: false or "none" の場合

    from typing import TypedDict, Optional
    
    class ExampleDict(TypedDict, total=False):
        optional_field: Optional[int]
    
    example_dict = ExampleDict()
    value = example_dict['optional_field']  # 診断は抑制される
    

型エラーとその解決策

reportTypedDictNotRequiredAccesstrue または "error" の場合、TypedDict の必須でないフィールドにアクセスしようとする際にエラーが報告される。この問題を解決するには、フィールドが存在するかどうかを確認する必要がある。

  • 型エラーを修正するためのサンプルコード:
    from typing import TypedDict, Optional
    
    class ExampleDict(TypedDict, total=False):
        optional_field: Optional[int]
    
    example_dict = ExampleDict()
    if 'optional_field' in example_dict:
        value = example_dict['optional_field']
    else:
        # フィールドが存在しない場合の適切な処理
        pass
    # `TypedDict` の必須でないフィールドの存在を確認してからアクセスする
    

reportGeneralTypeIssues

概要

reportGeneralTypeIssues: boolean or string

reportGeneralTypeIssues は、一般的な型の矛盾、サポートされていない操作、引数やパラメータの不一致などに関する診断を生成または抑制する設定である。この設定は、他のルールによってカバーされていない基本的な型チェックルール全般に適用される。構文エラーは含まれていない。デフォルト値は "error" である。

設定値ごとの挙動

  • reportGeneralTypeIssues: true or "error"

    • 一般的な型の矛盾やサポートされていない操作などに対してエラーを生成する。
  • reportGeneralTypeIssues: false or "none"

    • 一般的な型の問題に関する診断を抑制する。

サンプルコード

  • reportGeneralTypeIssues: true or "error" の場合

    def add(a: int, b: int) -> int:
        return a + "10"  # 型の矛盾があるためエラーが生成される
    
  • reportGeneralTypeIssues: false or "none" の場合

    def add(a: int, b: int) -> int:
        return a + "10"  # 一般的な型の問題に関する警告やエラーは抑制される
    

型エラーとその解決策

reportGeneralTypeIssuestrue または "error" の場合、一般的な型の矛盾やサポートされていない操作に対してエラーが報告される。この問題を解決するには、型が一致するようにコードを修正するか、適切な型注釈を追加する。

  • 型エラーを修正するためのサンプルコード:
    def add(a: int, b: int) -> int:
        return a + 10  # 型が一致するよう修正されている
    

reportUntypedNamedTuple

概要

reportUntypedNamedTuple: boolean or string

reportUntypedNamedTuple は、型情報を含まない namedtuple の代わりに型情報を含む NamedTuple の使用に関する診断を生成または抑制する設定である。namedtuple は古いスタイルのタプルで型情報が含まれていないが、NamedTuple は型注釈をサポートしており、型安全なプログラミングを促進する。デフォルト値は "none" である。

設定値ごとの挙動

  • reportUntypedNamedTuple: true or "error"

    • namedtuple の代わりに NamedTuple を使用しない場合にエラーを生成する。
  • reportUntypedNamedTuple: false or "none"

    • namedtupleNamedTuple の使用に関する診断を抑制する。

サンプルコード

  • reportUntypedNamedTuple: true or "error" の場合

    from collections import namedtuple
    
    MyTuple = namedtuple('MyTuple', 'field1 field2')
    # `namedtuple` の使用に対してエラーが生成される
    
  • reportUntypedNamedTuple: false or "none" の場合

    from collections import namedtuple
    
    MyTuple = namedtuple('MyTuple', 'field1 field2')
    # `namedtuple` の使用に対する警告やエラーは抑制される
    

型エラーとその解決策

reportUntypedNamedTupletrue または "error" の場合、namedtuple の代わりに NamedTuple を使用しない場合にエラーが報告される。この問題を解決するには、namedtuple の代わりに NamedTuple を使用し、型情報を含める。

  • 型エラーを修正するためのサンプルコード:
    from typing import NamedTuple
    
    class MyTuple(NamedTuple):
        field1: int
        field2: str
    # `NamedTuple` を使用して型情報を含める
    

reportPrivateUsage

概要

reportPrivateUsage: boolean or string

reportPrivateUsage は、プライベートまたはプロテクテッド変数や関数の不適切な使用に関する診断を生成または抑制する設定である。プロテクテッドクラスメンバーは単一のアンダースコア(_)で始まり、サブクラスからのみアクセスできる。プライベートクラスメンバーは二重アンダースコアで始まるが、末尾には二重アンダースコアがなく、宣言されたクラス内でのみアクセスできる。クラスの外で宣言された変数や関数は、名前が単一または二重アンダースコアで始まる場合、プライベートとみなされ、宣言されたモジュールの外部からはアクセスできない。デフォルト値は "none" である。

設定値ごとの挙動

  • reportPrivateUsage: true or "error"

    • プライベートまたはプロテクテッド変数や関数の不適切な使用に対してエラーを生成する。
  • reportPrivateUsage: false or "none"

    • プライベートまたはプロテクテッド変数や関数の使用に関する診断を抑制する。

サンプルコード

  • reportPrivateUsage: true or "error" の場合

    class MyClass:
        def __init__(self):
            self._protected_var = 42
            self.__private_var = 23
    
    obj = MyClass()
    print(obj._protected_var)  # プロテクテッド変数へのアクセス
    print(obj.__private_var)   # プライベート変数への不適切なアクセス、エラーが生成される
    
  • reportPrivateUsage: false or "none" の場合

    class MyClass:
        def __init__(self):
            self._protected_var = 42
            self.__private_var = 23
    
    obj = MyClass()
    print(obj._protected_var)  # プロテクテッド変数へのアクセス
    print(obj.__private_var)   # プライベート変数へのアクセス、警告やエラーは抑制される
    

型エラーとその解決策

reportPrivateUsagetrue または "error" の場合、プライベートまたはプロテクテッド変数や関数の不適切な使用に対してエラーが報告される。この問題を解決するには、プライベートメンバーへの外部からのアクセスを避け、適切なアクセス手段(公開メソッドやプロパティを通じたアクセスなど)を使用する。

  • 型エラーを修正するためのサンプルコード:
    class MyClass:
        def __init__(self):
            self._protected_var = 42
            self.__private_var = 23
    
        def get_private_var(self):
            return self.__private_var
    
    obj = MyClass()
    print(obj.get_private_var())  # プライベート変数への適切なアクセス方法
    # プライベートメンバーへの直接アクセスを避ける
    

reportTypeCommentUsage

概要

reportTypeCommentUsage: boolean or string

reportTypeCommentUsage は、型注釈が文法にサポートされていなかったPython 3.5以前のスタイルである「型コメント」の使用に関する診断を生成または抑制する設定である。Python 3.5では関数の型コメントが、Python 3.6では変数の型コメントが不要になった。将来のPythonバージョンでは、すべての型コメントのサポートが非推奨になる可能性がある。このチェックが有効の場合、指定された言語バージョンとの互換性のために必要でない限り、型コメントの使用を警告する。デフォルト値は "none" である。

設定値ごとの挙動

  • reportTypeCommentUsage: true or "error"

    • 型コメントの不要な使用に対してエラーを生成する。
  • reportTypeCommentUsage: false or "none"

    • 型コメントの使用に関する診断を抑制する。

サンプルコード

  • reportTypeCommentUsage: true or "error" の場合

    def add(a, b):
        # type: (int, int) -> int
        return a + b
    # 型コメントが使用されているため、エラーが生成される
    
  • reportTypeCommentUsage: false or "none" の場合

    def add(a, b):
        # type: (int, int) -> int
        return a + b
    # 型コメントの使用に対する警告やエラーは抑制される
    

型エラーとその解決策

reportTypeCommentUsagetrue または "error" の場合、型コメントの不要な使用に対してエラーが報告される。この問題を解決するには、Python 3.5以降のスタイルを使用して、型注釈を直接コード内に記述する。

  • 型エラーを修正するためのサンプルコード:
    def add(a: int, b: int) -> int:
        return a + b
    # 直接コード内に型注釈を記述する
    

reportConstantRedefinition

概要

reportConstantRedefinition: boolean or string

reportConstantRedefinition は、全て大文字とアンダースコア、数字で構成された変数名(一般的に定数とみなされる)を再定義しようとする試みに関する診断を生成または抑制する設定である。Pythonでは、全て大文字の変数名は通常、定数として扱われる。この設定のデフォルト値は "none" である。

設定値ごとの挙動

  • reportConstantRedefinition: true or "error"

    • 定数とみなされる変数の再定義に対してエラーを生成する。
  • reportConstantRedefinition: false or "none"

    • 定数の再定義に関する診断を抑制する。

サンプルコード

  • reportConstantRedefinition: true or "error" の場合

    MAX_SIZE = 100
    MAX_SIZE = 200  # 再定義、エラーが生成される
    
  • reportConstantRedefinition: false or "none" の場合

    MAX_SIZE = 100
    MAX_SIZE = 200  # 再定義、警告やエラーは抑制される
    

型エラーとその解決策

reportConstantRedefinitiontrue または "error" の場合、定数とみなされる変数の再定義に対してエラーが報告される。この問題を解決するには、定数の再定義を避け、必要に応じて異なる変数名を使用する。

  • 型エラーを修正するためのサンプルコード:
    MAX_SIZE = 100
    # MAX_SIZE の再定義を避ける
    NEW_MAX_SIZE = 200  # 新しい変数名を使用
    

reportPrivateImportUsage

概要

reportPrivateImportUsage: boolean or string

reportPrivateImportUsage は、モジュールからエクスポートされることを意図していない(つまり __all__ に含まれていない)シンボルをインポートしようとした場合の診断を生成または抑制する設定である。このようなインポートは、モジュールの内部実装に依存する可能性があり、予期しないエラーや互換性の問題を引き起こす可能性がある。デフォルト値は "error" である。

設定値ごとの挙動

  • reportPrivateImportUsage: true or "error"

    • __all__ に含まれていないシンボルのインポートに対してエラーを生成する。
  • reportPrivateImportUsage: false or "none"

    • __all__ に含まれていないシンボルのインポートに関する診断を抑制する。

サンプルコード

  • reportPrivateImportUsage: true or "error" の場合

    # 例: some_モジュールから `__all__` に含まれていないシンボルをインポートする
    from some_py_typed_module import internal_function
    # internal_function は `__all__` に含まれていないため、エラーが生成される
    
  • reportPrivateImportUsage: false or "none" の場合

    from some_py_typed_module import internal_function
    # `__all__` に含まれていないシンボルのインポートに対する警告やエラーは抑制される
    

型エラーとその解決策

reportPrivateImportUsagetrue または "error" の場合、__all__ に含まれていないシンボルのインポートに対してエラーが報告される。この問題を解決するには、公開されているAPIを使用するか、__all__ に含まれているシンボルのみをインポートする。

  • 型エラーを修正するためのサンプルコード:
    # 公開されているAPIを使用する
    from some_py_typed_module import public_function
    

reportDeprecated

概要

reportDeprecated: boolean or string

reportDeprecated は、非推奨とマークされているクラスや関数の使用に関する診断を生成または抑制する設定である。非推奨の機能は将来のバージョンで削除される可能性があるため、これらを使用することは避けるべきである。この設定のデフォルト値は "none" である。

設定値ごとの挙動

  • reportDeprecated: true or "error"

    • 非推奨とされるクラスや関数の使用に対してエラーを生成する。
  • reportDeprecated: false or "none"

    • 非推奨のクラスや関数の使用に関する診断を抑制する。

サンプルコード

  • reportDeprecated: true or "error" の場合

    import some_module
    
    some_module.deprecated_function()  # 非推奨の関数の使用、エラーが生成される
    
  • reportDeprecated: false or "none" の場合

    import some_module
    
    some_module.deprecated_function()  # 非推奨の関数の使用、警告やエラーは抑制される
    

型エラーとその解決策

reportDeprecatedtrue または "error" の場合、非推奨とされるクラスや関数の使用に対してエラーが報告される。この問題を解決するには、非推奨の機能を使用しないか、代替の現行の機能を使用する。

  • 型エラーを修正するためのサンプルコード:
    import some_module
    
    some_module.current_function()  # 非推奨の機能の代わりに現行の機能を使用
    

reportIncompatibleMethodOverride

概要

reportIncompatibleMethodOverride: boolean or string

reportIncompatibleMethodOverride は、ベースクラスでの同名メソッドを互換性のない方法でオーバーライドするメソッド(パラメータの数が異なる、パラメータの型が互換性がない、戻り値の型が互換性がないなど)に関する診断を生成または抑制する設定である。メソッドのオーバーライドは、基底クラスのインターフェースを尊重する形で行う必要があり、それに違反すると様々なランタイムエラーが発生する可能性がある。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportIncompatibleMethodOverride: true or "error"

    • ベースクラスのメソッドを互換性のない方法でオーバーライドするメソッドに対してエラーを生成する。
  • reportIncompatibleMethodOverride: false or "none"

    • 互換性のない方法でのメソッドオーバーライドに関する診断を抑制する。

サンプルコード

  • reportIncompatibleMethodOverride: true or "error" の場合

    class BaseClass:
        def method(self, param: int) -> str:
            return str(param)
    
    class SubClass(BaseClass):
        def method(self, param: str) -> int:  # オーバーライドが互換性がない
            return int(param)
    # SubClass の method が BaseClass の method と互換性がないため、エラーが生成される
    
  • reportIncompatibleMethodOverride: false or "none" の場合

    class BaseClass:
        def method(self, param: int) -> str:
            return str(param)
    
    class SubClass(BaseClass):
        def method(self, param: str) -> int:
            return int(param)
    # 互換性のないメソッドオーバーライドに対する警告やエラーは抑制される
    

型エラーとその解決策

reportIncompatibleMethodOverridetrue または "error" の場合、互換性のない方法でメソッドをオーバーライドするとエラーが報告される。この問題を解決するには、ベースクラスのメソッドと同じシグネチャ(パラメータの数と型、戻り値の型)でメソッドをオーバーライドする。

  • 型エラーを修正するためのサンプルコード:
    class BaseClass:
        def method(self, param: int) -> str:
            return str(param)
    
    class SubClass(BaseClass):
        def method(self, param: int) -> str:
            return super().method(param)
    # SubClass の method が BaseClass の method と互換性があるように修正されている
    

reportIncompatibleVariableOverride

概要

reportIncompatibleVariableOverride: boolean or string

reportIncompatibleVariableOverride は、ベースクラスで同名のシンボルが持つ型と互換性のない型でクラス変数をオーバーライドしようとする際の診断を生成または抑制する設定である。これは、クラス継承の際に基底クラスで定義された変数の型と派生クラスでの変数の型が異なる場合に発生する。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportIncompatibleVariableOverride: true or "error"

    • ベースクラスのシンボルと互換性のない型でクラス変数をオーバーライドする際にエラーを生成する。
  • reportIncompatibleVariableOverride: false or "none"

    • 互換性のない型でのクラス変数オーバーライドに関する診断を抑制する。

サンプルコード

  • reportIncompatibleVariableOverride: true or "error" の場合

    class BaseClass:
        var: int = 5
    
    class SubClass(BaseClass):
        var: str = "hello"  # ベースクラスの型と互換性がない
    # SubClass で var が BaseClass の var と互換性がないため、エラーが生成される
    
  • reportIncompatibleVariableOverride: false or "none" の場合

    class BaseClass:
        var: int = 5
    
    class SubClass(BaseClass):
        var: str = "hello"
    # 互換性のない型でのクラス変数オーバーライドに対する警告やエラーは抑制される
    

型エラーとその解決策

reportIncompatibleVariableOverridetrue または "error" の場合、互換性のない型でクラス変数をオーバーライドするとエラーが報告される。この問題を解決するには、ベースクラスで定義された変数と同じ型を派生クラスで使用するか、変数名を変更して新しい変数を定義する。

  • 型エラーを修正するためのサンプルコード:
    class BaseClass:
        var: int = 5
    
    class SubClass(BaseClass):
        var: int = 10  # BaseClass の var と同じ型を使用
    # SubClass の var が BaseClass の var と互換性があるように修正されている
    

reportInconsistentConstructor

概要

reportInconsistentConstructor: boolean or string

reportInconsistentConstructor は、__init__ メソッドのシグネチャが __new__ メソッドのシグネチャと矛盾している場合の診断を生成または抑制する設定である。Pythonでは、__new__ メソッドはクラスのインスタンスを生成し、__init__ メソッドはそのインスタンスを初期化するため、両者のシグネチャが整合性を持つことが望ましい。この設定のデフォルト値は "none" である。

設定値ごとの挙動

  • reportInconsistentConstructor: true or "error"

    • __init____new__ のシグネチャが一致しない場合にエラーを生成する。
  • reportInconsistentConstructor: false or "none"

    • __init____new__ のシグネチャの不一致に関する診断を抑制する。

サンプルコード

  • reportInconsistentConstructor: true or "error" の場合

    class MyClass:
        def __new__(cls, arg1, arg2):
            return super().__new__(cls)
    
        def __init__(self, arg1):
            self.arg1 = arg1
    # __new__ と __init__ のシグネチャが一致しないため、エラーが生成される
    
  • reportInconsistentConstructor: false or "none" の場合

    class MyClass:
        def __new__(cls, arg1, arg2):
            return super().__new__(cls)
    
        def __init__(self, arg1):
            self.arg1 = arg1
    # __new__ と __init__ のシグネチャの不一致に対する警告やエラーは抑制される
    

型エラーとその解決策

reportInconsistentConstructortrue または "error" の場合、__init____new__ のシグネチャが一致しないとエラーが報告される。この問題を解決するには、__init____new__ の両方のメソッドが同じ引数を受け取るように修正する。

  • 型エラーを修正するためのサンプルコード:
    class MyClass:
        def __new__(cls, arg1, arg2):
            return super().__new__(cls)
    
        def __init__(self, arg1, arg2):
            self.arg1 = arg1
            self.arg2 = arg2
    # __new__ と __init__ のシグネチャが一致するように修正されている
    

reportOverlappingOverload

概要

reportOverlappingOverload: boolean or string

reportOverlappingOverload は、シグネチャが重複しており、互いにオーバーラップするか、または戻り値の型が互換性がない関数のオーバーロードに関する診断を生成または抑制する設定である。オーバーロードされた関数がシグネチャで重複すると、期待される挙動と異なる結果を引き起こす可能性があり、型安全性に影響を与える。この設定のデフォルト値は "error" である。

設定値ごとの挙動

  • reportOverlappingOverload: true or "error"

    • シグネチャが重複するオーバーロードに対してエラーを生成する。
  • reportOverlappingOverload: false or "none"

    • シグネチャが重複するオーバーロードの診断を抑制する。

サンプルコード

  • reportOverlappingOverload: true or "error" の場合

    from typing import overload
    
    class Example:
        @overload
        def method(self, param: str) -> int:
            pass
    
        @overload
        def method(self, param: str) -> str:
            pass
    
        def method(self, param):
            if isinstance(param, int):
                return param * 2
            elif isinstance(param, str):
                return param * 2
    # method のオーバーロードがシグネチャで重複するため、エラーが生成される可能性がある
    
  • reportOverlappingOverload: false or "none" の場合

    from typing import overload
    
    class Example:
        # 省略...
    # シグネチャが重複するオーバーロードに対する警告やエラーは抑制される
    

型エラーとその解決策

reportOverlappingOverloadtrue または "error" の場合、シグネチャが重複するオーバーロードに対してエラーが報告される。この問題を解決するには、オーバーロードされた各メソッドが明確に区別されるシグネチャを持つように修正する。

  • 型エラーを修正するためのサンプルコード:
    from typing import overload
    
    class Example:
        @overload
        def method(self, param: int) -> int:
            pass
    
        @overload
        def method(self, param: str) -> str:
            pass
    
        def method(self, param):
            # 適切な型チェックと処理
            pass
    # オーバーロードされたメソッドが区別されるように修正されている
    

reportMissingSuperCall

概要

reportMissingSuperCall: boolean or string

reportMissingSuperCall は、サブクラス内の __init____init_subclass____enter____exit__ メソッドがベースクラスの同名メソッドへの呼び出しを行っていない場合の診断を生成または抑制する設定である。これらのメソッドは、継承されたクラスの機能を正しく利用するために、しばしば基底クラスの同名メソッドを呼び出す必要がある。この設定のデフォルト値は "none" である。

設定値ごとの挙動

  • reportMissingSuperCall: true or "error"

    • 基底クラスの同名メソッドへの呼び出しが欠けている場合にエラーを生成する。
  • reportMissingSuperCall: false or "none"

    • 基底クラスの同名メソッドへの呼び出しの欠如に関する診断を抑制する。

サンプルコード

  • reportMissingSuperCall: true or "error" の場合

    class BaseClass:
        def __init__(self):
            print("BaseClass __init__")
    
    class SubClass(BaseClass):
        def __init__(self):
            # super().__init__() の呼び出しが欠けている
            print("SubClass __init__")
    # SubClass の __init__ が BaseClass の __init__ を呼び出していないため、エラーが生成される
    
  • reportMissingSuperCall: false or "none" の場合

    class BaseClass:
        # ...
    
    class SubClass(BaseClass):
        # ...
    # 基底クラスの同名メソッドへの呼び出しの欠如に対する警告やエラーは抑制される
    

型エラーとその解決策

reportMissingSuperCalltrue または "error" の場合、基底クラスの同名メソッドへの呼び出しが欠けているとエラーが報告される。この問題を解決するには、適切なタイミングで基底クラスのメソッドを呼び出す。

  • 型エラーを修正するためのサンプルコード:
    class BaseClass:
        # ...
    
    class SubClass(BaseClass):
        def __init__(self):
            super().__init__()  # BaseClass の __init__ を呼び出す
            print("SubClass __init__")
    # SubClass の __init__ が BaseClass の __init__ を適切に呼び出している
    
info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。