回答編集履歴

4

追記

2020/12/22 04:09

投稿

quickquip
quickquip

スコア11235

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

些細

2020/12/22 04:09

投稿

quickquip
quickquip

スコア11235

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はまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
137
+ "これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
138
138
 
139
139
  型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。

2

変更

2020/12/22 03:00

投稿

quickquip
quickquip

スコア11235

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

追記

2020/12/22 01:40

投稿

quickquip
quickquip

スコア11235

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の標準ライブラリはこのクラスを指す名前を提供しません。Noneが唯一のインスタンスで、かつNone以外のインスタンスを生成することは不可能なので型ヒントにNoneを使っても不都合がないのです)
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が関係してきます。