Decorators in Python

2000 views Oct 30, 2024

ကျွန်တော်တို့ ဒီနေ့တော့ python decorators ကို လိုရင်းပဲပြောသွားပါမယ်။အဲ့တော့ python decorators တွေကိုနားလည်ဖို့ဆို python function တွေအလုပ်လုပ်ပုံကိုသိထားသင့်ပါတယ်။ကျွန်တော်တို့ decorator ဆိုတာက function တစ်ခုကို သူ့ထဲကို ခေါ်လိုက်ပြီး အဲ့function ရဲ့ အလုပ်လုပ်ပုံကို ထပ်ပြီးပြင်ဆင်လို့ရအောင်လုပ်တာပါ။နည်းနည်းရှုပ်သွားမလား။

ဥပမာ ကျွန်တော်တို့ function က Hello World လို့ထုတ်ပေးတယ်ဆို Hello World.How are you?လို့ အလိုလိုပြောင်းသွားအောင် လုပ်ပေးနိုင်ပါတယ်။function ရဲအလုပ်ကို ပြင်ဆင်လို့ရတယ်လို့ဆိုလိုတာပါ။အောက်က example ကိုကြည်လိုက်ပါ။

def my_decorator(wrap_function):
	def do_decorator_function(*args,**kwargs):
		return "{}How are you?".format(str(wrap_function()))
	return do_decorator_function
 
def echo():
	return "Hello World!"
 
 
print(echo())

ကျွန်တော်တို့ ဒီမှာ my_decorator ဆိုတဲ့ decorator ကိုကြေညာထားပါတယ်။သူ့အထဲက wrap function ကတော့ ကျွန်တော်တို့ပို့ပေးလိုက်မယ့် functionပါ။ကျွန်တော်ပြောခဲ့သလို function တွေကို modify လုပ်ပေးလို့ရတယ်ဆိုမှတော့ အဲ့function ကိုထည့်ပေးလိုက်မှအဆင်ပြေမှာပါ။သူ့အောက်က do_decorator_functionကတော့ decorator ထဲမှာပဲ အလုပ်လုပ်တာပါ။အဲ့တော့ အပေါ်က example ကိုrunလိုက်ရင် function ရဲ့ output ဖြစ်တဲ့ Hello World ကိုပဲတွေ့ရမှာပါ။

$ python decorators.py 
Hello World!

ကျွန်တော်တို့ decorator ကိုအောက်ကတိုင်း ထည့်ပေးလိုက်မယ်ဆိုရင်တော့

def my_decorator(wrap_function):
	def do_decorator_function(*args,**kwargs):
		return "{}How are you?".format(str(wrap_function()))
	return do_decorator_function
 
@my_decorator
def echo():
	return "Hello World!"
 
 
print(echo())

@my_decorator လေးက မိတ်ဆွေရဲ့ အောက်က function ကို wrap လုပ်လိုက်ပြီး  wrap_function ထဲရောက်သွားပါတယ်။အဲ့တော့မှ do_decorator_function  ကအလုပ်လုပ်ပြီး str(wrap_function())  လို့ခေါ်လိုက်တော့ နဂို function ကပြန်ပြီး Hello Worldကို {} ထဲကိုထည့်ပေးလိုက်ပါတယ်။return ကတော့ decorator ထဲမှာမို့ သူ့ရဲံအလုပ်လုပ်တဲ့ function ဖြစ်တဲ့ do_decorator_function ကိုပြန်ပေးလိုက်တာပါ။ဒါလေးပါပဲ။

$ python decorators.py 
Hello World!How are you?

ကျွန်တော်တို့ ဥပမာ decorator ထဲကို argumentတွေထည့်ပေးချင်တယ်ဆိုရင်လဲ

def square(wrap_function):
	def do_decorator_function(*args,**kwargs):
		number = wrap_function(*args,**kwargs)
		return number * number
	return do_decorator_function
 
@square
def number(number):
	return number
 
 
print(number(4))

ဒါကတော့နားလည်နေလောက်ပြီထင်ပါတယ်။*args,**kwargs ထည့်ပေးလိုက်တာနဲ့ အဆင်ပြေပါတယ်။4 က ရောက်သွားပြီး 4*4 ပုံစံဖြစ်သွားလို့မြှောက်ပြီးပြန်ပိုေ့ပးတာပါ။

$ python decorators.py 
16

လက်ရှိ python micro webframworkဖြစ်တဲ့ flask တို့မှာလဲ တွင်တွင်ကျယ်ကျယ် သုံးနေကျပါတယ်။တကယ်အသုံးဝင်တာမို့ တင်ပေးလိုက်တာပါ။Flask ကိုြက်ည့မယ်ဆို သူ့ရဲ့ routing ကို decorators နဲ့ထိန်းထားပါတယ်။

@app.route('/home/')
def home():
        return render_template('index.html')

အဲ့တော့ ‘/home/’ ဆိုတာလေးထည့်လို့ရအောင်ဘယ်လိုရေးထားတာလဲကို ဆက်ပြီးြက်ည့ရအောင်

def calc(choice):
	if choice == "square":
		def square(wrap_function):
			def do_decorator_function(*args,**kwargs):
				number = wrap_function(*args,**kwargs)
				return number * number
			return do_decorator_function
		return square
 
	elif choice == "plus":
		def plus(wrap_function):
			def do_decorator_function(*args,**kwargs):
				number = wrap_function(*args,**kwargs)
				return number + number
			return do_decorator_function
		return plus
 
@calc("plus")
def number(number):
	return number
 
 
print(number(4))

ဒီလိုပုံစံလေးပါပဲ နောက်တစ်ဆင့်လေးပဲတိုးသွားတာပါ။return squareတို့ ပြန်ပေးရတာလေးပါပဲ။အားလုံးနားလည်မယ်ထင်ပါတယ် code ကြည့်လိုက်ယုံနဲ့ ကျေးဇူးတင်ပါတယ်။