寄り道: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
はできない