পাইথন ডেকোরেটর
ডেকোরেটররা আপনাকে ফাংশনটির কোড পরিবর্তন না করে অতিরিক্ত আচরণ যোগ করার অনুমতি দেয়।
ডেকোরেটর এমন একটি ফাংশন যা ইনপুট হিসাবে অন্য একটি ফাংশন নেয় এবং একটি নতুন ফাংশন প্রদান করে।
ডেকোরেটর কিভাবে কাজ করে:
ডেকোরেটর আসল ফাংশনটি "বন্ধ" করে এবং নতুন ফাংশন রেন্ডার করে
বেসিক ডেকোরেটর
প্রথমে ডেকোরেটরকে সংজ্ঞায়িত করুন এবং তারপরে ফাংশনের উপরে @decorator_name দিয়ে এটি ব্যবহার করুন।
উদাহরণ
একটি মৌলিক ডেকোরেটর যা সজ্জিত ফাংশনের রিটার্ন মানকে পুঁজি করে।
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Hello Sally"
print(myfunction())
@changecase কে সরাসরি ফাংশনের সংজ্ঞার উপরে রেখে, myfunction ফাংশন চেঞ্জকেস ফাংশন দিয়ে "সজ্জিত" হয়।
changecase
ডেকোরেটর ফাংশন। এটি একটি আর্গুমেন্ট হিসাবে একটি ফাংশন নেয় এবং একটি নতুন ফাংশন প্রদান করে।
@changecase
ডেকোরেটর সিনট্যাক্স। এটি Python কে চেঞ্জকেস ডেকোরেটরের সাথে myfunction সাজাতে বলে।
myfunction
সাজাইয়া ফাংশন. এটি সাজসজ্জার পরে নতুন কার্যকারিতা প্রদান করে।
একাধিক ডেকোরেটর কল
একটি ডেকোরেটরকে একাধিকবার বলা যেতে পারে। আপনি যে ফাংশনটি সাজাতে চান তার উপরে ডেকোরেটর রাখুন।
উদাহরণ
দুটি ফাংশনে @চেঞ্জকেস ডেকোরেটর ব্যবহার করে:
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Hello Sally"
@changecase
def otherfunction():
return "I am speed!"
print(myfunction())
print(otherfunction())
I AM SPEED!
সজ্জিত ফাংশন আর্গুমেন্ট
যে ফাংশনগুলির জন্য আর্গুমেন্টের প্রয়োজন হয় সেগুলিও সাজানো যেতে পারে, শুধু র্যাপার ফাংশনে আর্গুমেন্টগুলি পাস করা নিশ্চিত করুন:
উদাহরণ
def changecase(func):
def myinner(x):
return func(x).upper()
return myinner
@changecase
def myfunction(nam):
return "Hello " + nam
print(myfunction("John"))
*আর্গস এবং **কোয়ার্গস
কখনও কখনও সজ্জিত ফাংশন থেকে পাস করা আর্গুমেন্টের উপর ডেকোরেটর ফাংশনের কোন নিয়ন্ত্রণ থাকে না, এই সমস্যাটি সমাধান করতে, র্যাপার ফাংশনে (*args, **kwargs) যোগ করুন, এইভাবে র্যাপার ফাংশন যেকোনো ধরনের আর্গুমেন্ট গ্রহণ করতে পারে এবং সেগুলিকে সজ্জিত ফাংশনে পাঠাতে পারে।
উদাহরণ
* args এবং ** kwargs আর্গুমেন্ট দিয়ে একটি ফাংশন রক্ষা করা:
def changecase(func):
def myinner(*args, **kwargs):
return func(*args, **kwargs).upper()
return myinner
@changecase
def myfunction(nam):
return "Hello " + nam
print(myfunction("John"))
টিপ:
*আর্গস যেকোনো সংখ্যক অবস্থানগত আর্গুমেন্ট গ্রহণ করে, **কোয়ার্গস যেকোনো সংখ্যক কীওয়ার্ড আর্গুমেন্ট গ্রহণ করে। এটি ডেকোরেটরকে আরও নমনীয় করে তোলে।
যুক্তি দিয়ে সাজসজ্জাকারী
ডেকোরেটররা অন্য একটি মোড়কের শর্ত যোগ করে তাদের নিজস্ব যুক্তি গ্রহণ করতে পারে।
উদাহরণ
একটি ডেকোরেটর ফ্যাক্টরি যা একটি যুক্তি নেয় এবং আর্গুমেন্ট মানের উপর ভিত্তি করে কেস পরিবর্তন করে।
def changecase(n):
def changecase(func):
def myinner():
if n == 1:
a = func().lower()
else:
a = func().upper()
return a
return myinner
return changecase
@changecase(1)
def myfunction():
return "Hello Linus"
print(myfunction())
অনেক ডেকোরেটর
একটি ফাংশন একাধিক ডেকোরেটর ব্যবহার করতে পারে।
এটি অন্যটির উপরে একটি স্থাপন করে করা হয়।
ডেকোরেটরগুলিকে বিপরীত ক্রমে বলা হয়, ফাংশনের সবচেয়ে কাছের থেকে শুরু করে।
উদাহরণ
ক্যাপিটালাইজেশনের জন্য ডেকোরেটর এবং শুভেচ্ছা যোগ করার জন্য ডেকোরেটর:
def changecase(func):
def myinner():
return func().upper()
return myinner
def addgreeting(func):
def myinner():
return "Hello " + func() + " Have a good day!"
return myinner
@changecase
@addgreeting
def myfunction():
return "Tobias"
print(myfunction())
দ্রষ্টব্য: ডেকোরেটর নীচে থেকে উপরে কাজ করে:
1. প্রথম অ্যাডগ্রিটিং কাজ: "হ্যালো টোবিয়াস আপনার দিনটি শুভ হোক!"
2. তারপর চেঞ্জকেস কাজ করে: "হ্যালো টোবিয়াস আপনার দিনটি শুভ হোক!"
অপারেশনাল মেটাডেটা সংরক্ষণ
পাইথনের ফাংশনগুলির মেটাডেটা রয়েছে যা __name__ এবং __doc__ বৈশিষ্ট্য ব্যবহার করে অ্যাক্সেস করা যেতে পারে।
গুরুত্বপূর্ণ নোট:
যখন একটি ফাংশন সজ্জিত করা হয়, তখন মূল ফাংশনের মেটাডেটা হারিয়ে যায়।
উদাহরণ 3: functools.wraps দিয়ে সুরক্ষিত করা
এটি ঠিক করার জন্য, পাইথনে একটি বিল্ট-ইন ফাংশন functools.wraps রয়েছে যা মূল ফাংশনের নাম এবং টেক্সটস্ট্রিং মোড়ানোর জন্য ব্যবহার করা যেতে পারে।
import functools
def changecase(func):
@functools.wraps(func)
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Have a great day!"
print(myfunction.__name__)