Python Decorators

পাইথন ডেকোরেটরকে বুঝুন

পাইথন ডেকোরেটর

ডেকোরেটররা আপনাকে ফাংশনটির কোড পরিবর্তন না করে অতিরিক্ত আচরণ যোগ করার অনুমতি দেয়।

ডেকোরেটর এমন একটি ফাংশন যা ইনপুট হিসাবে অন্য একটি ফাংশন নেয় এবং একটি নতুন ফাংশন প্রদান করে।

ডেকোরেটর কিভাবে কাজ করে:

মূল ফাংশন
ডেকোরেটর
উন্নত কার্যকারিতা

ডেকোরেটর আসল ফাংশনটি "বন্ধ" করে এবং নতুন ফাংশন রেন্ডার করে

বেসিক ডেকোরেটর

প্রথমে ডেকোরেটরকে সংজ্ঞায়িত করুন এবং তারপরে ফাংশনের উপরে @decorator_name দিয়ে এটি ব্যবহার করুন।

উদাহরণ

একটি মৌলিক ডেকোরেটর যা সজ্জিত ফাংশনের রিটার্ন মানকে পুঁজি করে।

def changecase(func):
  def myinner():
    return func().upper()
  return myinner

@changecase
def myfunction():
  return "Hello Sally"

print(myfunction())
আউটপুট:
HELLO SALLY

@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())
আউটপুট:
HELLO SALLY
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"))
আউটপুট:
HELLO 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())
আউটপুট:
hello linus

অনেক ডেকোরেটর

একটি ফাংশন একাধিক ডেকোরেটর ব্যবহার করতে পারে।

এটি অন্যটির উপরে একটি স্থাপন করে করা হয়।

ডেকোরেটরগুলিকে বিপরীত ক্রমে বলা হয়, ফাংশনের সবচেয়ে কাছের থেকে শুরু করে।

উদাহরণ

ক্যাপিটালাইজেশনের জন্য ডেকোরেটর এবং শুভেচ্ছা যোগ করার জন্য ডেকোরেটর:

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())
আউটপুট:
HELLO TOBIAS HAVE A GOOD DAY!

দ্রষ্টব্য: ডেকোরেটর নীচে থেকে উপরে কাজ করে:
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__)
আউটপুট:
myfunction

অনুশীলন করুন

পাইথনে ডেকোরেটরের মূল উদ্দেশ্য কী?

একটি ফাংশনের সোর্স কোড স্থায়ীভাবে পরিবর্তন করতে
✗ ভুল! ডেকোরেটররা মূল ফাংশনের কোড পরিবর্তন করে না। তারা ফাংশন বন্ধ করে এবং নতুন ফাংশন প্রদান করে।
স্বয়ংক্রিয়ভাবে সমস্ত রিটার্ন মানকে বড় হাতের অক্ষরে রূপান্তর করতে
✗ ভুল! এটি শুধুমাত্র চেঞ্জকেস ডেকোরেটরের একটি নির্দিষ্ট প্রয়োগের জন্য। ডেকোরেটরগুলি বিভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে।
একটি ফাংশন এর সোর্স কোড পরিবর্তন না করে তার আচরণ প্রসারিত/পরিবর্তন করতে মোড়ানো
✓ ঠিক আছে! এটি সাজসজ্জার নিখুঁত সংজ্ঞা। তারা ফাংশন মোড়ানো এবং মূল কোড অস্পর্শ রেখে অতিরিক্ত কার্যকারিতা যোগ করে এর আচরণ পরিবর্তন করে।
পারফরম্যান্সের জন্য C-তে পাইথন কোড কম্পাইল করুন
✗ ভুল! সজ্জাকারীদের সংকলন বা কর্মক্ষমতা উন্নতির সাথে কিছুই করার নেই। তারা কার্যকরী আচরণ পরিবর্তন করার একটি পদ্ধতি।