Pythonの型の扱いに困惑している

ただのメモ。

最近pythonを触ることになったのでいろいろ試してみているのだが、型がこれまで使ってきた言語と違うため、とても困惑している*1pythonそのものというよりライブラリのせいかもしれない。

例えばProblem 8 - Project Eulerをやってみると、以下のようにぱっと見よさそうなのに想定した結果にならない場合がある。

NGなコード

i = 0
j = 13
max_product = 0
while j < len(num) :
    tmp_str = num[i:j]
    tmp_product = np.prod([int(x) for x in list(tmp_str)])
    if (tmp_product > max_product):
        max_product = tmp_product
        max_str = tmp_str
    i = i + 1
    j = j + 1

print(max_str)
print(max_product)
    

OKなコード

i = 0
j = 13
max_product = 0
while j < len(num) :
    tmp_str = num[i:j]
    tmp_product = np.prod([int(x) for x in list(tmp_str)], dtype=np.int64)
    if (tmp_product > max_product):
        max_product = tmp_product
        max_str = tmp_str
    i = i + 1
    j = j + 1

print(max_str)
print(max_product)
    

NGなコードだと、np.prod()が暗黙的にnp.int32を仮定して値を返す*2ので、np.int32の上限値()までしか値が計算されず、正確な値を計算できない。

それ自体はしょうがないのだが、メソッドの引数で戻り値の型を指定するのは違和感が... 変数の宣言時に型を明示的に指定できるようにしてほしい(そして実行時でよいのでエラーを出力してほしい)。もしくは動的型付けなら、数値の桁ぐらいよろしく変換して適切な型で返してほしい。

とはいえ毎度、自前のコードに型判定を書くというものつらい。 正直、Pythonで型をどう扱えばいいものかわかりかねている。

参考

*1:扱える型が多い割りに動的型付けで

*2:OS依存かもしれない