回答編集履歴
4
追記
test
CHANGED
@@ -137,3 +137,81 @@
|
|
137
137
|
"これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
|
138
138
|
|
139
139
|
型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
----
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
(追記)
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
そもそも
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
```python
|
156
|
+
|
157
|
+
a: Optional[int]
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
...
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
a = cast(int, a)
|
166
|
+
|
167
|
+
```
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
は矛盾があります。上では"aはint型の値かNone"とヒントを示しているのに対して、下では"aはNoneではありえない"としているのですから。
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
型チェッカーの検査で下のcastが必要になるとしたら、省略している ... の箇所にreturn文やsys.exitなどがあってaがNoneである可能性が省かれていて、かつ**プログラマはそうと確信している**のに**型チェッカはそうと認識できない**ケースです。
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
それは2つの可能性があります。
|
180
|
+
|
181
|
+
型チェッカーの機能が不十分で"aがNoneである可能性が省かれている"ことが認識できない
|
182
|
+
|
183
|
+
か
|
184
|
+
|
185
|
+
型チェッカーに伝わるような書き方をプログラマがサボっている
|
186
|
+
|
187
|
+
か
|
188
|
+
|
189
|
+
です。
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
後者であればcast関数を書くことよりも、型チェッカーに分かるように伝わるように書くことに注力するべきでしょう。
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
前者であっても
|
198
|
+
|
199
|
+
```python
|
200
|
+
|
201
|
+
assert a is not None
|
202
|
+
|
203
|
+
```
|
204
|
+
|
205
|
+
か
|
206
|
+
|
207
|
+
```python
|
208
|
+
|
209
|
+
assert isinstance(a, int)
|
210
|
+
|
211
|
+
```
|
212
|
+
|
213
|
+
とチェックする方が正着な気がします。実行時チェックが**入る**ので動作としてはcastより時間がかかるかもしれませんが(本当にはわかりません)意味的なわかりやすさを優先する方がいいかと思います。
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
(このあたりの「わかりやすさ」は主観になるかとは思いますが)
|
3
些細
test
CHANGED
@@ -128,12 +128,12 @@
|
|
128
128
|
|
129
129
|
ということです。
|
130
130
|
|
131
|
-
これには**型ヒントやcast
|
131
|
+
これには**型ヒントやcastはまったく関係がありません**。
|
132
132
|
|
133
133
|
|
134
134
|
|
135
135
|
(誤解が生じるかもしれないので追記)
|
136
136
|
|
137
|
-
"これには型ヒントやcast
|
137
|
+
"これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
|
138
138
|
|
139
139
|
型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。
|
2
変更
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
Optional型の値(インスタンス)は存在しないので、「Optional型**の値**とint型**の値**を比較する」というようなことは、実行時には起こりません。
|
8
8
|
|
9
|
-
型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によって
|
9
|
+
型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によっては型チェックの結果として警告されることがありえます。
|
10
10
|
|
11
11
|
|
12
12
|
|
1
追記
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
Optional型の値(インスタンス)は存在しないので、「Optional型**の値**とint型**の値**を比較する」というようなことは、実行時には起こりません。
|
8
8
|
|
9
|
-
型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは問題がありません。
|
9
|
+
型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によって問題があったりなかったりします。
|
10
10
|
|
11
11
|
|
12
12
|
|
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
また型ヒントに書く`None`は、`type(None)`の略記です。
|
68
68
|
|
69
|
-
(`type(None)`はNoneTypeというクラスを返しますが、Pythonの標準ライブラリ
|
69
|
+
(`type(None)`はNoneTypeというクラスを返しますが、Pythonの標準ライブラリはこのクラスを指す名前を提供しません。Noneが唯一のインスタンスで、かつNone以外のインスタンスを生成することは不可能なので型ヒントにNoneを使っても不都合がないのです)
|
70
70
|
|
71
71
|
|
72
72
|
|
@@ -129,3 +129,11 @@
|
|
129
129
|
ということです。
|
130
130
|
|
131
131
|
これには**型ヒントやcastとはまったく関係がありません**。
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
(誤解が生じるかもしれないので追記)
|
136
|
+
|
137
|
+
"これには型ヒントやcastとはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
|
138
|
+
|
139
|
+
型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。
|