BT
Keyword Argument Injection with Python Decorators
5th Eyl 2010 | Sınıfı: BT 2

Here is the English version.
Nesne yönelimli kod yazarken sınıf özelliklerine (değişkenlerine) sıklıkla verilen argüman değerlerini atarız. Her bir argüman için bu işi yapmak büyük satır kalabalığı demektir. Bakalım:

class Test:
    def __init__(self, x, y, z, t):
        self.x = x
        self.y = y
        self.z = z
        self.t = t
        print self.x,self.y,self.z,self.t

Buradaki tekrar eden benzer satırları yok etmek için bir decorator çözümü geliştirdim:

def injectArguments(inFunction):
    def outFunction(*args,**kwargs):
        _self = args[0]
        _self.__dict__.update(kwargs)
        inFunction(*args,**kwargs)
    return outFunction
 
class Test:
    @injectArguments
    def __init__(self, x, y, z, t):
        print self.x,self.y,self.z,self.t
 
    @injectArguments
    def fonksiyon(self, ad):
	print "Ad:",self.ad
 
t = Test(x=4, y=5, z=6, t=7)
t.fonksiyon(ad="Emre")

args, argümanları içeren bir sözlük iken kwargs anahtar kelimeli argümanları içeren bir sözlük. arg[0] self’e karşılık geliyor. Yapacağımız şey self.__dict__’i yani t nesnesinin değişkenlerin değerlerini tutan bu sözlüğü verilen anahtar kelimeli argümanlarla ( {‘x’:4, ‘y’:5,’z':6,’t':7} ) genişletmek/güncellemek olacak. Bu sayede self.x = x vb. kodlardan kurtulmuş olacağız.

Python’un kütüphanelerinde bunun için hazır bir çözüm var mı (varsa söyleyin lütfen) bilmiyorum ama bu kodu bir hayli kullanacağım gibi. ActiveState Recipies sitesine koyduğum bu koda yeni bir yorum geldi, keyword kullanmadan (ad=”Emre” yerine “Emre” diyerek) bu iş yapılabiliyormuş. Nasıl mı? fonksiyonadi.func_code.co_varnames dediğinizde o fonksiyonun parametrelerinin adlarını öğrenebiliyormuşsunuz. Çok önemli bir bilgi.

Etiketler: ,
2 Comments
  1. Ahmet AYGÜN
    18.30 on Eylül 5th, 2010

    Bu kadar işlevsel bir decorator hayal etmemiştim :) ellerine sağlık..

  2. Ahmet Emre Aladağ
    18.39 on Eylül 5th, 2010

    Hehehe :) Bilmiyorum nasıl oldu da geldi aklıma ama keşke buna bir çözüm olsa diye düşünüp duruyordum uzun zamandır. Sen decorator belgesini gönderince (daha önce decoratorları duymuş olmama rağmen) dank etti birden =) Recipies’e da gönderdim şurada.

Leave a Reply

IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)

What is 7 + 14 ?
Please leave these two fields as-is: