Obljubljena naloga iz dekoratorjev

Dekorator v_float1

Napiši dekorator v_float1, s katerim lahko dekoriramo funkcije, ki imajo en sam argument. Dekorator naj funkcijo dekorira tako, da pred klicem funkcije spremeni njen argument v float.

Dekorator bi lahko uporabili tako

@v_float1
def kvadrat(x):
    return x ** 2

in potem klicali

kvadrat("12")

Seveda pa mora še vedno delati tudi

kvadrat(4)

Poglej rešitve nalog, ki smo jih delali skupaj. Tam smo z dekoratorjem poklicali funkcijo in nato spreminjali njen rezultat (zaokrožili smo ga z round). Tu pa pustimo rezultat pri miru in pred klicem spreminjamo argumente.

Dekorator v_float

Ta dekorator dela isto, le s funkcijami, ki prejmejo poljubno število argumentov. Vse mora spremeniti v float, da bomo lahko funkcijo

@v_float
def hipo(a, b):
    from math import sqrt
    return sqrt(a ** 2 + b ** 2)

klicali z

hipo(3, 4)
hipo(3, "4")
hipo("3", "4")
hipo("3", 4)

Dekorator v

Ta je pa za kravžljanje možganov (a ne bo prehudo, če preberete prej omenjene rešitve nalog, kjer smo že naredili nekaj podobnega.

Namesto da bi vedno pretvarjal v float, pretvarja v tisto, kar damo kot argument dekoratorju.

Če napišemo

@v(float)
def hipo(a, b):
    from math import sqrt
    return sqrt(a ** 2 + b ** 2)

se hipo obnaša enako kot prej, poleg tega pa lahko napišemo, recimo

s = [4, 5, 6]

@v(int)
def k_ti(k):
    return s[k]

in argument (k) se pretvarja v int.