#!/usr/bin/env python
# -*- coding: utf-8 -*-
def vypis(kolekce):
print(type(kolekce))
for i in kolekce:
print(i)
print()
seznam = ["Alfa", 42, 42, ("Beta", "Gamma")]
mnozina = {"Alfa", 42, 42, ("Beta", "Gamma")}
vypis(seznam)
vypis(mnozina)
Jak vidíš, tak proceduře vypis() je v daném případě jedno, zda jí předhodíš seznam nebo množinu. Vypíše obojí. Pokud je budu potřebovat rozlišit, stále ještě mohu použít reflexi.
Tento příklad krásně ilustruje problém dynamicky typovaných jazyků. Procedura vypis() implicitně předpokládá, že parametr kolekce se dá iterovat a že iterací dostanu objekty, pro které má smysl volat print(). Když nebudou splněny obě tyto podmínky, funkce havaruje. Pravděpodobně vyhodí nějakou výjimku, kterou buď očekávám a musím na ni nějak zareagovat, nebo výjimka shodí celý program. Kdybych se chtěl výjimce vyhnout, musel bych v kódu nějak ošetřit chování funkce pro všechny typy, které nejsou "iterable<printable>". Ovšem ze zadání může plynout, že nemá smysl volat vypis() na takové typy. Ve staticky typovaném jazyce bych jednoduše přidal parametru kolekce typ iterable<printable> a mohl bych se spolehnout, že případné chyby odhalí kompilátor při překladu. V dynamicky typovaném jazyce můžu tento požadavek tak akorát napsat do dokumentace a případně doufat, že na každé použití této funkce někdo napíše test, že se v tom kokrétním místě vždy volá se správným typem.
Na tomto příkladu můžeme vidět ještě jednu vlastnost dynamických typů.
Jsem pečlivý programátor, a do tý funkce print() dám aserci, abych varoval, že vkládám špatné vstupy. Tím dosáhnu toho, že ta funkce bude házet výjimky, což je ale další rozměr, který té funkci přidám. Ty výjimky musím ne/odchytit. Nesmí se mi poplést. Neměl bych je přehlédnout. A hlavně, hmm, kdy vlastně nastane? Díky Murphymu, tak na produkci, a budu rád, když budu logovat.
Statické typování má tu výhodu, že taková situace jednoduše neexistuje. Pokud popletu vstupy, tak to na mě zařve kompilátor. Hned! Nemusím testovat, jestli ta funkce vyhodila nějakou chybu, protože jsem se překlpl. Spustu věcí nemusím dělat. Kód je kratší a přímočařejší.