rodbina = """Adam: Matjaž-90; Cilka-88; Daniel-85; Erik-83 Matjaž: Viljem-58 Viljem: Tadeja-20 Daniel: Elizabeta-67; Hans-64 Elizabeta: Ludvik-50; Jurij-49; Barbara-45; Herman-39; Mihael-32 Jurij: Franc-30; Jožef-29 Herman: Margareta-3 Jožef: Alenka-9; Aleksander-5; Petra-7""" def sestavi_rodbino(rodbina): import inspect caller_frame = inspect.currentframe() globals = caller_frame.f_globals globals["adam"] = Oseba(None, "Adam", "Ž", 111) for opis in rodbina.splitlines(): ime, opisi_otrok = opis.split(":") oseba = globals[ime.lower()] for otrok in opisi_otrok.split(";"): ime, starost = otrok.split("-") ime = ime.strip() starost = int(starost) otrok = Oseba(oseba, ime, "MŽ"[ime[-1] == "a"], starost) globals[ime.lower()] = otrok oseba.otroci.append(otrok) class Oseba: def __init__(self, prednik, ime, spol, starost): self.prednik = prednik self.ime = ime self.spol = spol self.starost = starost self.otroci = [] @staticmethod def rodilnik(s): if s[-2:] == "er": return s[:-2] + "ra" elif s[-1] == "a": return s[:-1] + "e" else: return s + "a" def __str__(self): if self.prednik: return "{} ({}, {} {})".format( self.ime, self.starost, ["hči", "sin"][self.spol=="M"], self.rodilnik(self.prednik.ime)) else: return "{} ({})".format(self.ime, self.starost) __repr__ = __str__ sestavi_rodbino(rodbina) import unittest class Testi_Rodbina(unittest.TestCase): def test_nekdo_brez_potomca(self): self.assertEqual(brez_potomca(matjaž), "Tadeja") self.assertEqual(brez_potomca(barbara), "Barbara") self.assertTrue(brez_potomca(jurij) in {"Franc", "Alenka", "Petra", "Aleksander"}) self.assertTrue(brez_potomca(elizabeta) in {"Franc", "Alenka", "Petra", "Aleksander", "Ludvik", "Barbara", "Margareta", "Mihael"}) def test_najmlajsi(self): self.assertEqual(najmlajsi(adam), "Margareta") self.assertEqual(najmlajsi(jurij), "Aleksander") self.assertEqual(najmlajsi(herman), "Margareta") self.assertEqual(najmlajsi(matjaž), "Tadeja") def test_brez_potomcev(self): self.assertEqual(brez_potomcev(matjaž), {"Tadeja"}) self.assertEqual(brez_potomcev(barbara), {"Barbara"}) self.assertEqual(brez_potomcev(jurij), {"Franc", "Alenka", "Petra", "Aleksander"}) self.assertEqual(brez_potomcev(elizabeta), {"Franc", "Alenka", "Petra", "Aleksander", "Ludvik", "Barbara", "Margareta", "Mihael"}) def test_najmlajsi_let(self): self.assertEqual(najmlajsi_let(adam), 3) self.assertEqual(najmlajsi_let(jurij), 5) self.assertEqual(najmlajsi_let(herman), 3) self.assertEqual(najmlajsi_let(matjaž), 20) if __name__ == "__main__": unittest.main()