kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

PEP 483を読む(続き)

 

漸進的型付け(Gradual Typing)

漸進的型付けとは、プログラムの一部だけをアノテートすることで動的型付けと静的型付け双方の望ましい側面を強化するものです。

つけるとよさそうなところだけ型を明示する

この間型ヒント付けてて思ったのは、つけ忘れても何も言わないんだなあってこと
オプションでもつければ警告してくれるのかもだけど
つけないよりマシとは言えるんだろうけど
つけたほうがよさそうなところについてないとき気づけるように
なっているか

調和する(is consistent with)という新しい関係を定義します。これは、Anyが関わってくると推移的でないということを除けば部分型であるという関係と類似しています。a_valueの型がa_variableの型と調和していればa_valueをa_variableに代入することができます。オブジェクト指向プログラミングの基本を表す、「a_valueの型がa_variableの型の部分型であればa_valueをa_variableに代入することができる」という文と比較してみてください。

訳語がわからなくて調和としてます
一貫でもいいとは思いますけど一致じゃおかしいしなあ

  • 型t1が型t2の部分型であれば、t1はt2に調和する(反対は成り立たない)
  • Anyはすべての型と調和する(しかしAnyはどんな型の部分型でもない)
  • すべての型はAnyと調和する(しかしどんな型もAnyの部分型ではない)

全否定なのか部分否定なのかちょっと自信なし
流れ的に全否定な気がした

2番めと3番めが同時になりたつっていうのはちょっとピンとこないところがある

これだけです!Jeremy Siekのブログ記事What is Gradual Typingを見ればもっと長い説明と同期があります。

これはQiitaに和訳があった
What is Gradual Typing: 漸進的型付けとは何か - Qiita
ということだけ確認したけどまだ読んでない

Anyはすべての値とすべての関数を持つ型とみなされています。

すべての値を持つということはもっとも一般的な型で、
すべてのメソッドを持つということはもっとも特殊な型である、
ってことだな
2番め3番めと同じようなことを言っている
なにか変わったことを考えてますね?

上記の部分型の定義と合わせて、これによりAnyは部分的には型階層の最上位にあり(すべての値を持つから)、部分的には最下部にある(すべてのメソッドを持つから)ことになります。

そうですね
でも部分型の定義、で合ってるのかな
is-consistent-withの定義、じゃないの?
じゃないんだろうな

これをobjectと比べてみます。objectはほとんどの型と調和していません(intが期待されているところにobject()は使えない)。別の言い方をすれば、Anyとobjectはどちらも、引数をアノテートするときには"どんな型でも許される”という意味になりますが、期待されている型にかかわらず渡すことができるのはAnyだけ、ということです。つまり、Anyは動的型付けへの縮退を宣言し、静的チェッカーが文句を言わないようにするのです。

なるほどここはチェックしないでねっていう宣言なわけか
そのためにそういう理不尽な型があると
でもすでに、どんな型の値も代入できるobject型があるわけだから
どんな型の変数にも代入できるという型を作るだけでは
足りなかったのかな?
両方あわせ持つ型が必要なのかな?

worker: Employeeという変数と
something: Any = some_func()という変数があるとすると
something = workerという代入はエラーにならないんだって
これは気持ち悪い

といってもそれがふさわしい場面もあるんだろうなあ