Üst üste iki decorator kullanmak

Bu gönderideki gibi bir fonksiyon üzerinde iki bezeyici kullanmaya çalıştım fakat sıkıntı yaşadım. Sanırım staticmethodun nasıl çalıştığını bilmediğimden oldu. Kodu sorunsuz çalıştırabilirim lütfen bana yorumlarda çözüme nasıl gideceğimi söylemeyin. Amacım sonuca kısa yollardan gitmek ve yeni şeyler kullanmak. Burda staticmethod ve kendi yazdığım bezeyicinin birlikte çalışmama sebebini söyler misiniz ?

Şimdiden teşekkürler.

import requests,json

#Ertugrul-cakici

class Github:

    api_url = "https://api.github.com/"

    def __init__(self):

        self.api_url = "https://api.github.com/"

        

    def cevirici(func):

        def ic(username):

            veri = func(username)

            data = json.loads(veri)

            return json.dumps(data,indent=4)

        return ic

    @cevirici

    @staticmethod       

    def getUser(username):

        api_url = Github.api_url

        return requests.get(api_url+"users/"+username).text

    @cevirici

    @staticmethod

    def getRepository(username):

        api_url = Github.api_url

        return requests.get(api_url+"users/"+username+"/repos").text

while True:

    secim = input("1- Find User\n2- Get repository\n3- Create repositroy\n4- Exit\nSeçin: ")

    if secim == "1":

        who = input("Kullanıcı adı: ")

        data = Github.getUser(who)

        print(data)

    elif secim == "2":

        print(Github.getRepository(input("Kullanıcı adı: ")))

    elif secim == "3":

        pass

    elif secim == "4":

        break
1 Beğeni

Bezeyicilerde en alttaki bezeyici ilk olarak çağırılır.

getUser metodu üzerinden gidecek olursak, şu anki getUser adlı fonksiyon cevirici bezeyicisinin döndürdüğü ic fonksiyonu. getUser değişkeni geri dönen ic fonksiyonunu saklıyor, ve bu ic fonksiyonu bir staticmethod değil. Siz en son elde edeceğimiz getUser fonksiyonunun bir staticmethod olmasını istiyorsunuz; ama şu anda staticmethod olan değişken cevirici’ye verilen func parametresi, yani şu:

    @staticmethod       
    def getUser(username):
        api_url = Github.api_url
        return requests.get(api_url+"users/"+username).text

staticmethod’lar çağırılabilen nesneler değil, bu yüzden şu satırda hata alıyorsunuz:

Yapmanız gereken staticmethod, classmethod gibi bezeyicileri en üstte kullanarak en son çağırılmalarını sağlamak:

    @staticmethod
    @cevirici
    def getUser(username):

        api_url = Github.api_url

        return requests.get(api_url+"users/"+username).text

    @staticmethod
    @cevirici
    def getRepository(username):

        api_url = Github.api_url

        return requests.get(api_url+"users/"+username+"/repos").text

Umarım anlatabilmişimdir.

1 Beğeni

Böyle yaptığımızda staticmethod aslında ceviricinin bezeyicisi gibi bir şey mi oluyor acaba ?

cevirici fonksiyonunun döndürdüğü ic fonksiyonunu beziyor.

Bezeyicilerdeki @ sözdizimi sadece bir syntactic sugar, aynı kodu normal yoldan yazarsak belki daha anlaşılır olur. Bu iki kod eşdeğer:

    @staticmethod 
    @cevirici   
    def getUser(username):
        api_url = Github.api_url
        return requests.get(api_url+"users/"+username).text
    def getUser(username):
        api_url = Github.api_url
        return requests.get(api_url+"users/"+username).text

    getUser = cevirici(getUser)
    getUser = staticmethod(getUser)
1 Beğeni

Elinize sağlık hocam. Bu kullanımı öğrenmiştim fakat alttan üste okuduğunu bilmiyordum. Ben staticmethodu çağırıp öyle çeviriciye göndermiş olmuşum o zaman. Şimdi anladım