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