2026.02.13 20:21
Pythonの型チェック
・というところで、忘れた頃に再チャレンジのニューラルネットワーク。
・まずはここからでしょということで、再びニューロンをPythonで。しかし、改めて思う。Pythonって雑というのか、おおらかというのか。
・わかって使っている分には便利ではあるけれど、逆におおらかすぎて、型を間違って与えると痛い目にあう。
・たとえば、
x=[1,2,3]
y=np.array(x)
で、
x*2は[1,2,3,1,2,3]
y*2はarray([2,4,6])
になるという具合。個人でボソボソやる分にはいいけど、大規模開発なら盛大なバグの養殖場になってしまいそうだ。
・ということで、例によってGCC(Gemini/ChatGPT/Copilot)に頼ってみたら、
from beartype import beartype
とやって(baretypeかと思ったら本当に熊のbear)、関数の直前に
@beartype
xxx_func(x:int, y:np.ndarray)->float:
みたいに型を指定してやると、チェックしてもらえるらしい。また、
from beartype.claw import beartype_this_package # 「爪 (claw)」という強力な機能
beartype_this_package() # これをプログラムの最初に1行書くだけ
と、プログラムの先頭に書いておけば自動的に全関数が対象になるらしい。
・更に関数を引数にとった場合、
from collections.abc import Callable(abcはAbstruct Base Classes)
としたあと、
def executioner(func: Callable[[int, int], int]):
のようにすると、引数にした関数(ここではfunc())の引数や戻り値の型や数がチェックされるという仕掛けらしい。
・実際にどうなのかなと色々いじって遊んだあと、ざっと書いていたニューロンの動作が変になったので、調べていったら単なるスカラーのはずなのに行列が渡されているけど、エラーにもならずにそのまま突っ走っているのが確認できた。早速覚えたてのこれらを埋め込んで見たら見事に引っかかった。
・エラーメッセージが著しくわかりにくいけど、じっと読んで該当する行を見つけてじっと眺めていたら、「あっ!」な記述が見つかった。
・これを修正して改めて実行したら予定通りの結果が得られた。