Python にはタイプヒントというものがある。ヒントを与えるだけで Python のインタプリタとしてはなにもしない。
def greeting(name: str) -> str:
return 'Hello ' + name
PEP 0484 に詳しいが上のようなコードは name が文字列で戻り値も文字列であることを示している。示しているだけで、実行時には何ももしない。PEP の言葉を借りる。
「Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.」
型に関して Python がたどってきた道は奥が深い。Python2 から Python3 へバージョンアップする過程で int の解釈を変えている。
python2 のコードで次のようなコードを見かけたことがある。数字の最後に L の文字がある。python2 では整数がハードウェア依存の 32bit や 64bit に多少引きずられている。
a=0x12345678L
python3 では整数はより抽象的になった。int と long の区別はない。
python2
>>> print type(0x1000000000000000)
<type 'int'>
>>> print type(0x10000000000000000)
<type 'long'>
python3
>>> print(type(0x1000000000000000))
<class 'int'>
>>> print(type(0x10000000000000000))
<class 'int'>
Polyphony ではどうする?残念ながら Polyphony では int は任意のビット長にできるものの上限がある。対象がハードウェアなのでインタプリタのように数がある制限を超えたら領域を取り直して差し替える、と言ったことは出来ない。デフォルトでは 32 ビットになっている(64 や 128 に変更可能)。
ターゲットをどこにするかにもよるが、pynum でのハードウェアに引きずられた環境も歓迎されているところを見ると、現状で問題ないと踏んでいる。
一方、ハードウェア的な要求からビット幅を決定したいときがある。その時はどうしたらよいか?すでに Queue や Port で使用されているがその際には int64 や bit64 などを利用してもらいたい。数字は中途半端でもよい。例えば bit9 なども可能だ。uint は過去に導入したが deprecated とする方向だ。
これを使うとハードウェアの資源を抑えたコードを書くことが出来る。次に示すのは x_mem で内部的に使用されるメモリの宣言だ。
from polyphony.typing import List, bit, bit2, bit8
... 中略 ...
def worker(self):
block = [0] * self.max_block_n * BLOCK_SIZE # type: List[bit8]
... 後略 ...
変数の宣言にも使える。例をあげよう。
data:bit8 = self.xmodem_in_q.rd()
block_no:bit8 = 1
Polyphony は型推定を積極的に行っているので、書かなくてもよいところもある。例えば、上記の rd() から読み取った値を代入する変数は型推定で自動的に bit8 になる。