#!/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.