回答編集履歴

2

些細

2023/05/05 07:19

投稿

quickquip
quickquip

スコア11235

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

1

追記

2021/04/08 02:59

投稿

quickquip
quickquip

スコア11235

test CHANGED
@@ -95,3 +95,39 @@
95
95
  ```
96
96
 
97
97
  実際dictはSequenceではないです。
98
+
99
+
100
+
101
+ ----
102
+
103
+ (追記)
104
+
105
+
106
+
107
+ > 型ヒントやmypy等を併用する場合は意味があるかと思うのですが、それらと組み合わせて使用することを前提としている機能なのでしょうか?
108
+
109
+
110
+
111
+ そうだと思いました、という回答でした。
112
+
113
+
114
+
115
+ 型チェックでdictはSequenceでないことにしたい、つまり
116
+
117
+
118
+
119
+ ```python
120
+
121
+ def foo(seq: Sequence): pass
122
+
123
+
124
+
125
+ d = {'a': 1}
126
+
127
+ foo(d) # ☆
128
+
129
+ ```
130
+
131
+ に対して☆で警告をだしたいという要求があります。
132
+
133
+ それにはDuck Typingでは不足で、そこで導入されたのabcだったのでは、ということです。