teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

些細

2023/05/05 07:19

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -1,67 +1,67 @@
1
- 使う側からするとabcのメリットは「mixinでメソッドが追加されることが期待できる」という感じかと思います。
2
- [https://docs.python.org/ja/3/library/collections.abc.html](https://docs.python.org/ja/3/library/collections.abc.html)
3
- から、例えば**ABCの**`Set`を継承して`__contains__`, `__iter__`, `__len__`の3つを実装したら`__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__`, `isdisjoint`が全部手に入ることが期待できます。
4
- ```python
5
- >>> from collections.abc import Set
6
-
7
- >>> class OneToFiveSet(Set):
8
- ... def __contains__(self, x):
9
- ... return isinstance(x, int) and 1 <= x <= 5
10
- ... def __iter__(self):
11
- ... return iter(range(1, 6))
12
- ... def __len__(self):
13
- ... return 5
14
-
15
- >>> s = OneToFiveSet()
16
-
17
- >>> s > {1,2,3} # 実装してない__gt__が使える
18
- True
19
- ```
20
-
21
-
22
- ただしmixinは抽象クラス(と多重継承)があれば十分なんじゃないか、という感じはあります。
23
-
24
- ----
25
-
26
- Pythonの言語仕様設計者がabcを必要した理由はまたちょっと複雑そうです。
27
-
28
- あるオブジェクトがあるプロトコルを満たしているかは、「あるメソッドを持っているか(=Duck Typing)」だけでは十分じゃないケースがある。精確にはPythonの仕様の中に**もう存在してしまって**いた。
29
- という理由な気がします。
30
-
31
- [Sequenceプロトコル](https://docs.python.org/ja/3/glossary.html#term-sequence)がそうです。
32
- Sequenceであるためには、Iterableであってかつ`__len__`メソッドを実装している**必要があります**。が、逆は言えません。つまりIterableであってかつ`__len__`メソッドを実装していてもSequenceであるとは限りません。
33
-
34
- [https://docs.python.org/ja/3/glossary.html#term-sequence](https://docs.python.org/ja/3/glossary.html#term-sequence)
35
- > dict は `__getitem__()` と `__len__()` もサポートしますが、検索の際に整数ではなく任意の immutable なキーを使うため、シーケンスではなくマッピング (mapping) とみなされているので注意してください。
36
-
37
- とあります。
38
- dictがSequence**でない**ことは表現するには、Duck Typingでは不足です。
39
- かつdictはSequenceでないこと**したかった**のでしょう。
40
-
41
- ここでabcを導入する必要があったのではないでしょうか。
42
-
43
- ```python
44
- >>> from collections.abc import Sequence
45
-
46
- >>> issubclass(dict, Sequence)
47
- False
48
- ```
49
- 実際dictはSequenceではないです。
50
-
51
- ----
52
- (追記)
53
-
54
- > 型ヒントやmypy等を併用する場合は意味があるかと思うのですが、それらと組み合わせて使用することを前提としている機能なのでしょうか?
55
-
56
- そうだと思いました、という回答でした。
57
-
58
- 型チェックでdictはSequenceでないことにしたい、つまり
59
-
60
- ```python
61
- def foo(seq: Sequence): pass
62
-
63
- d = {'a': 1}
64
- foo(d) # ☆
65
- ```
66
- に対して☆で警告をだしたいという要求があります。
1
+ 使う側からするとabcのメリットは「mixinでメソッドが追加されることが期待できる」という感じかと思います。
2
+ [https://docs.python.org/ja/3/library/collections.abc.html](https://docs.python.org/ja/3/library/collections.abc.html)
3
+ から、例えば**ABCの**`Set`を継承して`__contains__`, `__iter__`, `__len__`の3つを実装したら`__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__`, `isdisjoint`が全部手に入ることが期待できます。
4
+ ```python
5
+ >>> from collections.abc import Set
6
+
7
+ >>> class OneToFiveSet(Set):
8
+ ... def __contains__(self, x):
9
+ ... return isinstance(x, int) and 1 <= x <= 5
10
+ ... def __iter__(self):
11
+ ... return iter(range(1, 6))
12
+ ... def __len__(self):
13
+ ... return 5
14
+
15
+ >>> s = OneToFiveSet()
16
+
17
+ >>> s > {1,2,3} # 実装してない__gt__が使える
18
+ True
19
+ ```
20
+
21
+
22
+ ただしmixinは抽象クラス(と多重継承)があれば実際は十分です。
23
+
24
+ ----
25
+
26
+ Pythonの言語仕様設計者がabcを必要した理由はまたちょっと複雑そうです。
27
+
28
+ あるオブジェクトがあるプロトコルを満たしているかは、「あるメソッドを持っているか(=Duck Typing)」だけでは十分じゃないケースがある。精確にはPythonの仕様の中に**もう存在してしまって**いた。
29
+ という理由な気がします。
30
+
31
+ [Sequenceプロトコル](https://docs.python.org/ja/3/glossary.html#term-sequence)がそうです。
32
+ Sequenceであるためには、Iterableであってかつ`__len__`メソッドを実装している**必要があります**。が、逆は言えません。つまりIterableであってかつ`__len__`メソッドを実装していてもSequenceであるとは限りません。
33
+
34
+ [https://docs.python.org/ja/3/glossary.html#term-sequence](https://docs.python.org/ja/3/glossary.html#term-sequence)
35
+ > dict は `__getitem__()` と `__len__()` もサポートしますが、検索の際に整数ではなく任意の immutable なキーを使うため、シーケンスではなくマッピング (mapping) とみなされているので注意してください。
36
+
37
+ とあります。
38
+ dictがSequence**でない**ことは表現するには、Duck Typingでは不足です。
39
+ それでもdictはSequenceでないということ**表現したかった**のでしょう。
40
+
41
+ ここでabcを導入する必要があったのではないでしょうか。
42
+
43
+ ```python
44
+ >>> from collections.abc import Sequence
45
+
46
+ >>> issubclass(dict, Sequence)
47
+ False
48
+ ```
49
+ 実際dictはSequenceではないです。
50
+
51
+ ----
52
+ (追記)
53
+
54
+ > 型ヒントやmypy等を併用する場合は意味があるかと思うのですが、それらと組み合わせて使用することを前提としている機能なのでしょうか?
55
+
56
+ そうだと思いました、という回答でした。
57
+
58
+ 型チェックでdictはSequenceでないことにしたい、つまり
59
+
60
+ ```python
61
+ def foo(seq: Sequence): pass
62
+
63
+ d = {'a': 1}
64
+ foo(d) # ☆
65
+ ```
66
+ に対して☆で警告をだしたいという要求があります。
67
67
  それにはDuck Typingでは不足で、そこで導入されたのabcだったのでは、ということです。

1

追記

2021/04/08 02:59

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -46,4 +46,22 @@
46
46
  >>> issubclass(dict, Sequence)
47
47
  False
48
48
  ```
49
- 実際dictはSequenceではないです。
49
+ 実際dictはSequenceではないです。
50
+
51
+ ----
52
+ (追記)
53
+
54
+ > 型ヒントやmypy等を併用する場合は意味があるかと思うのですが、それらと組み合わせて使用することを前提としている機能なのでしょうか?
55
+
56
+ そうだと思いました、という回答でした。
57
+
58
+ 型チェックでdictはSequenceでないことにしたい、つまり
59
+
60
+ ```python
61
+ def foo(seq: Sequence): pass
62
+
63
+ d = {'a': 1}
64
+ foo(d) # ☆
65
+ ```
66
+ に対して☆で警告をだしたいという要求があります。
67
+ それにはDuck Typingでは不足で、そこで導入されたのabcだったのでは、ということです。