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

回答編集履歴

4

追記

2020/12/22 04:09

投稿

quickquip
quickquip

スコア11353

answer CHANGED
@@ -67,4 +67,43 @@
67
67
 
68
68
  (誤解が生じるかもしれないので追記)
69
69
  "これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
70
- 型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。
70
+ 型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。
71
+
72
+ ----
73
+
74
+ (追記)
75
+
76
+ そもそも
77
+
78
+ ```python
79
+ a: Optional[int]
80
+
81
+ ...
82
+
83
+ a = cast(int, a)
84
+ ```
85
+
86
+ は矛盾があります。上では"aはint型の値かNone"とヒントを示しているのに対して、下では"aはNoneではありえない"としているのですから。
87
+
88
+ 型チェッカーの検査で下のcastが必要になるとしたら、省略している ... の箇所にreturn文やsys.exitなどがあってaがNoneである可能性が省かれていて、かつ**プログラマはそうと確信している**のに**型チェッカはそうと認識できない**ケースです。
89
+
90
+ それは2つの可能性があります。
91
+ 型チェッカーの機能が不十分で"aがNoneである可能性が省かれている"ことが認識できない
92
+
93
+ 型チェッカーに伝わるような書き方をプログラマがサボっている
94
+
95
+ です。
96
+
97
+ 後者であればcast関数を書くことよりも、型チェッカーに分かるように伝わるように書くことに注力するべきでしょう。
98
+
99
+ 前者であっても
100
+ ```python
101
+ assert a is not None
102
+ ```
103
+
104
+ ```python
105
+ assert isinstance(a, int)
106
+ ```
107
+ とチェックする方が正着な気がします。実行時チェックが**入る**ので動作としてはcastより時間がかかるかもしれませんが(本当にはわかりません)意味的なわかりやすさを優先する方がいいかと思います。
108
+
109
+ (このあたりの「わかりやすさ」は主観になるかとは思いますが)

3

些細

2020/12/22 04:09

投稿

quickquip
quickquip

スコア11353

answer CHANGED
@@ -63,8 +63,8 @@
63
63
  それ以外の `<`, `>`, `<=`, `>=` は、まったく関連がなく比較が実装されていない型同士ではTypeErrorが発生します。
64
64
 
65
65
  ということです。
66
- これには**型ヒントやcastはまったく関係がありません**。
66
+ これには**型ヒントやcastはまったく関係がありません**。
67
67
 
68
68
  (誤解が生じるかもしれないので追記)
69
- "これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
69
+ "これには型ヒントやcastはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
70
70
  型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。

2

変更

2020/12/22 03:00

投稿

quickquip
quickquip

スコア11353

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Optional はPython上の型ではなく、アノテーションとして書ける型ヒントでしかありません。
4
4
  Optional型の値(インスタンス)は存在しないので、「Optional型**の値**とint型**の値**を比較する」というようなことは、実行時には起こりません。
5
- 型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によって問題があったなかったりします。
5
+ 型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によっては型チェックの結果として警告されることがあります。
6
6
 
7
7
  そもそも、比較に限らず、実行時には型ヒントは**無視される**ので、型ヒントが原因で何かが起こったり起こらなかったりするということは**ありません**。(型ヒント自体がエラーになることはあっても)
8
8
 

1

追記

2020/12/22 01:40

投稿

quickquip
quickquip

スコア11353

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Optional はPython上の型ではなく、アノテーションとして書ける型ヒントでしかありません。
4
4
  Optional型の値(インスタンス)は存在しないので、「Optional型**の値**とint型**の値**を比較する」というようなことは、実行時には起こりません。
5
- 型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは問題がありません。
5
+ 型チェッカーが検査するときに「Optional型**の式**とint型**の式**を比較する」ということは起こりますが、これは~~問題がありません~~演算子によって問題があったりなかったりします
6
6
 
7
7
  そもそも、比較に限らず、実行時には型ヒントは**無視される**ので、型ヒントが原因で何かが起こったり起こらなかったりするということは**ありません**。(型ヒント自体がエラーになることはあっても)
8
8
 
@@ -32,7 +32,7 @@
32
32
  > Optional[X] を Union[X, None] の略記として利用することが出来ます。
33
33
 
34
34
  また型ヒントに書く`None`は、`type(None)`の略記です。
35
- (`type(None)`はNoneTypeというクラスを返しますが、Pythonの標準ライブラリはこのクラスを指す名前を提供しません。Noneが唯一のインスタンスで、かつNone以外のインスタンスを生成することは不可能なので型ヒントにNoneを使っても不都合がないのです)
35
+ (`type(None)`はNoneTypeというクラスを返しますが、Pythonの標準ライブラリはこのクラスを指す名前を提供しません。Noneが唯一のインスタンスで、かつNone以外のインスタンスを生成することは不可能なので型ヒントにNoneを使っても不都合がないのです)
36
36
 
37
37
  [https://docs.python.org/ja/3/library/typing.html#type-aliases](https://docs.python.org/ja/3/library/typing.html#type-aliases)
38
38
 
@@ -63,4 +63,8 @@
63
63
  それ以外の `<`, `>`, `<=`, `>=` は、まったく関連がなく比較が実装されていない型同士ではTypeErrorが発生します。
64
64
 
65
65
  ということです。
66
- これには**型ヒントやcastとはまったく関係がありません**。
66
+ これには**型ヒントやcastとはまったく関係がありません**。
67
+
68
+ (誤解が生じるかもしれないので追記)
69
+ "これには型ヒントやcastとはまったく関係がありません"と書いたのは"実行時に型ヒントやcastが関係して挙動が変わることはありません"という意味です。
70
+ 型チェッカーが検査するときは、当然ですが、型ヒントやcastが関係してきます。