kb84tkhrのブログ

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

寄り道:Type Hint

ちょっと調べたほうがいいかもな

ということで調べてたら型ヒントっていうのが出てきた

26.1. typing — 型ヒントのサポート — Python 3.6.5 ドキュメント

Python3.5から使えるみたいだからAOJでも使える

System info | Aizu Online Judge

こういうもの

def greeting(name: str) -> str:
    return 'Hello ' + name

見ればだいたい雰囲気はわかる
やってみる

$ python3
Python 3.6.5 (default, Jun 17 2018, 12:15:43)
>>> def greeting(name: str) -> str:
...     return 'Hello ' + name
...
>>> greeting("Taro")
'Hello Taro'
>>> greeting(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in greeting
TypeError: must be str, not int

ふむ
書いただけで使えるみたい

で、型エイリアスというのがあって

エイリアスは型をエイリアスに代入することで定義されます。この例では Vector と List[float] は交換可能な同義語として扱われます。

つまりこういうことができると

from typing import List
Vector = List[float]

これはまさしく

Polygon = list

でやろうとしてたことだなあと
エイリアスとかそういうことを考えてたわけではなくて
クラスがオブジェクトなのなら代入してやれば使えるだろうと思って
やってみただけなんですが

そもそもlistはクラスなんだっけ?

>>> list
<class 'list'>

クラスだ
こっちは?

>>> Polygon = list
>>> Polygon
<class 'list'>

実体はlist
クラスがオブジェクトなら当然な感じ
型ヒントができる前だってできた模様

$ python
Python 2.7.10 (default, Aug 17 2018, 19:45:58)
>>> list
<type 'list'>
>>> Polygon = list
>>> Polygon
<type 'list'>

これは型エイリアスとは言わないのかもしれない
ちなみに普通にクラス作るとどうなるの

>>> class Polygon(list): pass
...
>>> Polygon
<class '__main__.Polygon'>

こっちはPolygonっていうクラスになるわけだな

じゃあ型エイリアスのところに出てる例

>>> from typing import List
>>> Vector = List[float]
>>> Vector
typing.List[float]

Listはlistそのものではないんだな

>>> a = list([1, 2, 3])

はできても

>>> a = List([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/typing.py", line 1880, in __new__
    raise TypeError("Type List cannot be instantiated; "
TypeError: Type List cannot be instantiated; use list() instead

はできない