回答編集履歴

3

エラー隠しの方法は問題ありなので修正

2025/01/05 05:48

投稿

jmc
jmc

スコア8

test 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
- def __add__(self, other:int|float|数式)->数式:
12
+ > def __add__(self, other:int|float|数式)->数式:
13
- # 例0: 数式("x") + 数式("y") = 数式("x+y")
13
+ > # 例0: 数式("x") + 数式("y") = 数式("x+y")
14
- # 例1: 数式("x") + 実数("1") = 数式("x+1")
14
+ > # 例1: 数式("x") + 実数("1") = 数式("x+1")
15
- # 例2: 数式("x") + 1 = 数式("x+1")
15
+ > # 例2: 数式("x") + 1 = 数式("x+1")
16
- # 例3: 実数("1") + 数式("x") = 数式("x+1")
16
+ > # 例3: 実数("1") + 数式("x") = 数式("x+1")
17
- # 例4: 実数("1") + 実数("2") = 実数("3")
17
+ > # 例4: 実数("1") + 実数("2") = 実数("3")
18
- # 例5: 実数("1") + 2 = 実数("3")
18
+ > # 例5: 実数("1") + 2 = 実数("3")
19
- pass
19
+ > pass
20
-
20
+ > 引用テキスト
21
- class 実数(数式):
21
+ > class 実数(数式):
22
- @overload
22
+ > @overload
23
- def __add__(self, other:int|float|実数)->実数:
23
+ > def __add__(self, other:int|float|実数)->実数:
24
- # 例4: 実数("1") + 実数("2") = 実数("3")
24
+ > # 例4: 実数("1") + 実数("2") = 実数("3")
25
- # 例5: 実数("1") + 2 = 実数("3")
25
+ > # 例5: 実数("1") + 2 = 実数("3")
26
- pass
26
+ > pass
27
- @overload
27
+ > @overload
28
- def __add__(self, other:数式)->数式:
28
+ > def __add__(self, other:数式)->数式:
29
- # 例3: 実数("1") + 数式("x") = 数式("x+1")
29
+ > # 例3: 実数("1") + 数式("x") = 数式("x+1")
30
- # 例4: 実数("1") + 実数("2") = 実数("3")
30
+ > # 例4: 実数("1") + 実数("2") = 実数("3")
31
- pass
31
+ > pass
32
- # エラー隠し ここから
32
+ > # エラー隠し ここから
33
- @overload
33
+ > @overload
34
- def __add__( # type: ignore[overload-cannot-match]
34
+ > def __add__( # type: ignore[overload-cannot-match]
35
- self, other:int|float|数式)->数式:
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 を追加

2025/01/02 05:39

投稿

jmc
jmc

スコア8

test 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

エラーを隠す方法を見つけたので追記

2025/01/02 05:37

投稿

jmc
jmc

スコア8

test 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
- https://stackoverflow.com/questions/79322581/
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 とは無関係です。)