TLDR: Tu další vrstvu kontroly, dokumentace a jednoduchý refactoring, ti mohou dát jen a pouze testy. Mrkni se na výbornou knihovnu pytest
V Pythonu existují "type hints", ale je otázka, jestli někdy budou nějak více používány. Ono se to totiž jeví jako dobrý nápad někomu, kdo přichází ze staticky typovaného jazyka, ale jen do doby, než se s Python více sžije, a zjistí, že to k ničemu nepotřebuje.
Python tohle řeší elegantně silnou typovou kontrolou. Pádem programu tě upozorní, že se pokoušíš o nějakou hloupost, jako třeba vynásobit sting a int. A obvykle ti k tomu dá pěknou chybovou hlášku. Jsou to ale v zásadě vyjímečné případy, kvůli kterým nemá cenu zavádět statické typování. Je to zásadní rozdíl oproti jiným dynamicky typovaným jazykům se slabou typovou kontrolou, jako třeba ten JavaScript, kde můžeš míchat typy skoro jakkoliv.
Zároveň tě ale Python nesvazuje konkrétními typy. Většinou ti na konkrétním typu nezáleží. Když pracuješ s číslem, tak je ti jedno, jestli je to int, float, či jíný typ. Když iteruješ nad kolekcí, tak je ti jedno, co to je, hlavně že tím jde iterovat. V situacích, kde na tom typu záleží, obvykle pracuješ v kontextu nějaké knihovny, která definuje vlastní typy, a tam se zas nespleteš díky tomu kontextu.
Tu další vrstvu kontroly při psaní kódu, spjatou s dokumentační vrstvou a jednodužší refactoring, ti statické typy nedají. To je taková iluze staticky typovaných jazyků, že když to jde zkompilovat, tak je to v pořádku. Dokud to není pokryté testy, tak tam jsou stejně chyby. A když máš testy, tak víš, že jsi nikde typy nepopletl, i bez zbytečně omezujících statických typů.