回答編集履歴
3
エラー隠しの方法は問題ありなので修正
    
        answer	
    CHANGED
    
    | @@ -2,41 +2,41 @@ | |
| 2 2 | 
             
            (例えば、mypyとは別の静的型チェッカ pyright などでは、**overload を使って override されたメソッドは、不整合とみなされる** [(No overload signature in override is compatible with base method)](https://github.com/stripe/stripe-python/issues/1149) ようで、 mypyでも同じことなのかもしれません。)
         | 
| 3 3 |  | 
| 4 4 |  | 
| 5 | 
            +
            (2025/1/5追記) かつて提案した下記の方法は、 `--warn-unused-ignores` フラグをつけて mypy を利用した場合にエラーとなるので、おすすめされません。
         | 
| 5 6 |  | 
| 6 | 
            -
            また、**根本的な解決ではありません**が、次のようにすると、エラーを隠せることに気が付きました。
         | 
| 7 | 
            +
            > また、**根本的な解決ではありません**が、次のようにすると、エラーを隠せることに気が付きました。
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            ```python:test.pyi(エラーを隠す)
         | 
| 8 | 
            +
            > ```python:test.pyi(エラーを隠す)
         | 
| 9 | 
            -
            from typing import overload
         | 
| 9 | 
            +
            > from typing import overload
         | 
| 10 | 
            -
             | 
| 10 | 
            +
            > 引用テキスト
         | 
| 11 | 
            -
            class 数式:
         | 
| 11 | 
            +
            > class 数式:
         | 
| 12 | 
            -
             | 
| 12 | 
            +
            >     def __add__(self, other:int|float|数式)->数式:
         | 
| 13 | 
            -
             | 
| 13 | 
            +
            >         # 例0: 数式("x") + 数式("y") = 数式("x+y")
         | 
| 14 | 
            -
             | 
| 14 | 
            +
            >         # 例1: 数式("x") + 実数("1") = 数式("x+1")
         | 
| 15 | 
            -
             | 
| 15 | 
            +
            >         # 例2: 数式("x") + 1         = 数式("x+1")
         | 
| 16 | 
            -
             | 
| 16 | 
            +
            >         # 例3: 実数("1") + 数式("x") = 数式("x+1")
         | 
| 17 | 
            -
             | 
| 17 | 
            +
            >         # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 18 | 
            -
             | 
| 18 | 
            +
            >         # 例5: 実数("1") + 2         = 実数("3")
         | 
| 19 | 
            -
             | 
| 19 | 
            +
            >         pass
         | 
| 20 | 
            -
             | 
| 20 | 
            +
            > 引用テキスト
         | 
| 21 | 
            -
            class 実数(数式):  
         | 
| 21 | 
            +
            > class 実数(数式):  
         | 
| 22 | 
            -
             | 
| 22 | 
            +
            >     @overload
         | 
| 23 | 
            -
             | 
| 23 | 
            +
            >     def __add__(self, other:int|float|実数)->実数:
         | 
| 24 | 
            -
             | 
| 24 | 
            +
            >         # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 25 | 
            -
             | 
| 25 | 
            +
            >         # 例5: 実数("1") + 2         = 実数("3")
         | 
| 26 | 
            -
             | 
| 26 | 
            +
            >         pass 
         | 
| 27 | 
            -
             | 
| 27 | 
            +
            >     @overload
         | 
| 28 | 
            -
             | 
| 28 | 
            +
            >     def __add__(self, other:数式)->数式:
         | 
| 29 | 
            -
             | 
| 29 | 
            +
            >         # 例3: 実数("1") + 数式("x") = 数式("x+1")
         | 
| 30 | 
            -
             | 
| 30 | 
            +
            >         # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 31 | 
            -
             | 
| 31 | 
            +
            >         pass
         | 
| 32 | 
            -
             | 
| 32 | 
            +
            >     # エラー隠し ここから
         | 
| 33 | 
            -
             | 
| 33 | 
            +
            >     @overload
         | 
| 34 | 
            -
             | 
| 34 | 
            +
            >     def __add__( # type: ignore[overload-cannot-match]
         | 
| 35 | 
            -
             | 
| 35 | 
            +
            >                 self, other:int|float|数式)->数式:
         | 
| 36 | 
            -
             | 
| 36 | 
            +
            >     # エラー隠し ここまで
         | 
| 37 | 
            -
            ```
         | 
| 37 | 
            +
            > ```
         | 
| 38 | 
            -
            最後の overload に、親と全く同じシグネチャのメソッドを追加することで、強制的に整合させました。
         | 
| 38 | 
            +
            > 最後の overload に、親と全く同じシグネチャのメソッドを追加することで、強制的に整合させました。
         | 
| 39 | 
            -
            但し、このやり方では、将来のバージョンにて、本記事で議論している問題が解決されたときに、メソッドの追加部分にコードが到達しなくなるという問題が発生します。
         | 
| 39 | 
            +
            > 但し、このやり方では、将来のバージョンにて、本記事で議論している問題が解決されたときに、メソッドの追加部分にコードが到達しなくなるという問題が発生します。
         | 
| 40 | 
            -
            mypy ではこれは `[overload-cannot-match]` というエラーになりますので、将来のバージョンに備えて予め `# type: ignore[overload-cannot-match]` しています。
         | 
| 40 | 
            +
            > mypy ではこれは `[overload-cannot-match]` というエラーになりますので、将来のバージョンに備えて予め `# type: ignore[overload-cannot-match]` しています。
         | 
| 41 | 
            -
             | 
| 41 | 
            +
            > 引用テキスト
         | 
| 42 | 
            -
            (一見すると、単に `# type: ignore` でエラーを黙らせただけに見えるかもしれませんが、ここで追加した `# type: ignore[overload-cannot-match]` はあくまで将来発生するエラーに対するものであり、現行の mypy とは無関係です。)
         | 
| 42 | 
            +
            > (一見すると、単に `# type: ignore` でエラーを黙らせただけに見えるかもしれませんが、ここで追加した `# type: ignore[overload-cannot-match]` はあくまで将来発生するエラーに対するものであり、現行の mypy とは無関係です。)
         | 
2
「既知の問題」の記述にurl を追加
    
        answer	
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            [stackoverflow で海外のエンジニアの方に質問した](https://stackoverflow.com/questions/79322581/)ところ、これは既知の問題であるが、すぐに解決することを期待できないとのコメントをいただきました。
         | 
| 2 | 
            -
            (例えば、 pyright などでは、**overload を使って override されたメソッドは、不整合とみなされる** [(No overload signature in override is compatible with base method)](https://github.com/stripe/stripe-python/issues/1149) ようで、 mypyでも同じことなのかもしれません。)
         | 
| 1 | 
            +
            [stackoverflow で海外のエンジニアの方に質問した](https://stackoverflow.com/questions/79322581/)ところ、これは[既知](https://github.com/python/mypy/issues/12379)の問題であるが、すぐに解決することを期待できないとのコメントをいただきました。
         | 
| 2 | 
            +
            (例えば、mypyとは別の静的型チェッカ pyright などでは、**overload を使って override されたメソッドは、不整合とみなされる** [(No overload signature in override is compatible with base method)](https://github.com/stripe/stripe-python/issues/1149) ようで、 mypyでも同じことなのかもしれません。)
         | 
| 3 3 |  | 
| 4 4 |  | 
| 5 5 |  | 
1
エラーを隠す方法を見つけたので追記
    
        answer	
    CHANGED
    
    | @@ -1,3 +1,42 @@ | |
| 1 | 
            -
            stackoverflow で海外のエンジニアに質問したところ、これは既知の問題であるが、すぐに解決することを期待できないとのコメントをいただきました。
         | 
| 1 | 
            +
            [stackoverflow で海外のエンジニアの方に質問した](https://stackoverflow.com/questions/79322581/)ところ、これは既知の問題であるが、すぐに解決することを期待できないとのコメントをいただきました。
         | 
| 2 | 
            +
            (例えば、 pyright などでは、**overload を使って override されたメソッドは、不整合とみなされる** [(No overload signature in override is compatible with base method)](https://github.com/stripe/stripe-python/issues/1149) ようで、 mypyでも同じことなのかもしれません。)
         | 
| 2 3 |  | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            また、**根本的な解決ではありません**が、次のようにすると、エラーを隠せることに気が付きました。
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ```python:test.pyi(エラーを隠す)
         | 
| 9 | 
            +
            from typing import overload
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class 数式:
         | 
| 12 | 
            +
                def __add__(self, other:int|float|数式)->数式:
         | 
| 13 | 
            +
                    # 例0: 数式("x") + 数式("y") = 数式("x+y")
         | 
| 3 | 
            -
             | 
| 14 | 
            +
                    # 例1: 数式("x") + 実数("1") = 数式("x+1")
         | 
| 15 | 
            +
                    # 例2: 数式("x") + 1         = 数式("x+1")
         | 
| 16 | 
            +
                    # 例3: 実数("1") + 数式("x") = 数式("x+1")
         | 
| 17 | 
            +
                    # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 18 | 
            +
                    # 例5: 実数("1") + 2         = 実数("3")
         | 
| 19 | 
            +
                    pass
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            class 実数(数式):  
         | 
| 22 | 
            +
                @overload
         | 
| 23 | 
            +
                def __add__(self, other:int|float|実数)->実数:
         | 
| 24 | 
            +
                    # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 25 | 
            +
                    # 例5: 実数("1") + 2         = 実数("3")
         | 
| 26 | 
            +
                    pass 
         | 
| 27 | 
            +
                @overload
         | 
| 28 | 
            +
                def __add__(self, other:数式)->数式:
         | 
| 29 | 
            +
                    # 例3: 実数("1") + 数式("x") = 数式("x+1")
         | 
| 30 | 
            +
                    # 例4: 実数("1") + 実数("2") = 実数("3")
         | 
| 31 | 
            +
                    pass
         | 
| 32 | 
            +
                # エラー隠し ここから
         | 
| 33 | 
            +
                @overload
         | 
| 34 | 
            +
                def __add__( # type: ignore[overload-cannot-match]
         | 
| 35 | 
            +
                            self, other:int|float|数式)->数式:
         | 
| 36 | 
            +
                # エラー隠し ここまで
         | 
| 37 | 
            +
            ```
         | 
| 38 | 
            +
            最後の overload に、親と全く同じシグネチャのメソッドを追加することで、強制的に整合させました。
         | 
| 39 | 
            +
            但し、このやり方では、将来のバージョンにて、本記事で議論している問題が解決されたときに、メソッドの追加部分にコードが到達しなくなるという問題が発生します。
         | 
| 40 | 
            +
            mypy ではこれは `[overload-cannot-match]` というエラーになりますので、将来のバージョンに備えて予め `# type: ignore[overload-cannot-match]` しています。
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            (一見すると、単に `# type: ignore` でエラーを黙らせただけに見えるかもしれませんが、ここで追加した `# type: ignore[overload-cannot-match]` はあくまで将来発生するエラーに対するものであり、現行の mypy とは無関係です。)
         |