2 entry daha
  • python 3 çalışırken az önce okuduğum yapılar.

    kendi anladığımı buraya yazayım.
    pek açıklanmamış çünkü. üstadlar el atar belki bir ara.
    (eski üstadların muazzam entrylerini okuyamıyoruz sanırım artık pek...)

    yanlışım varsa düzeltiniz. pythonda parametre olarak bir fonksiyon alan ve bunu süzgeçten geçirip aynı fonksiyonun değerini return eden bir yapı.

    pozitif tam sayıların toplamını alan bir fonksyion yazdığımızı hayal edelim.

    def sum_pos(a, b):
    if type(a) != int or type(b) != int or a <=0 or b<=0:
    return "pozitif tam sayı gir dedik."
    return a+b

    print(sum_pos(1,2))

    şimdi bu kontrolü fonksiyonun ilk satırında gerçekleştirdik. ancak diyelim ki zaman zaman bazı farklı operasyonlarda da pozitif tam sayı kontrolüne sahip olmamız gerek.

    sık sık tekrarlanan bir işlem olduğu için dry felsefesine aykırı oluyor. (bkz: don't repeat yourself)

    böyle bir durumda biz bir filtre yazsak ve o filtreye giren fonksiyonun parametreleri test edilse böylece her ihtiyac duyduğumuzda fonksiyon içine sürekli if yazmaktan kurtulsak daha mantıklı olur.

    bunu da şu şekilde yapabiliriz.

    öncelikle fonksiyonu ve o fonksiyona girecek parametreleri alan ve bunları if clauselar ile test eden bir fonksiyon yazarız.

    def sum_pos_filter(func):
    def wrapper(a, b):
    if type(a) != int or type(b) != int or a <= 0 or b <= 0:
    return "pozitif tam sayı gir dedik."
    return func(a, b)
    return wrapper

    bu bir filtredir. fonksiyonu alır ve içindeki kapsayıcı fonksiyonda ise parametreleri alır.

    artık yukarıdakini bir decorator olarak pozitif tam sayı kontrolü ihtiyacı duyan tüm fonksiyonlarımızda kullanabiliriz. şu şekilde:

    @sum_pos_filter
    def sum_pos(a, b):
    return a+b

    print(sum_pos(-1,2))

    artık @sum_pos_filter ı her ihtiyaç duyan fonksiyonda kullanabiliriz.

    not: yazdığım decorator 2 parameter içindir. henuz *args için nasıl olacağını öğrenmedim. öğrendiğimde hatırlarsam burayı editleyeceğim.

    edit:

    *args tuple dönermiş bu yüzden

    def sum_pos_filter(func):
    def wrapper(*args):
    for i in args:
    if type(i) != int or i <= 0:
    return "pozitif tam sayı gir dedik."
    return func(*args)
    return wrapper

    şeklinde düzenlememiz yeterlidir.
5 entry daha
hesabın var mı? giriş yap