ডেকোরেটর আপনাকে ফাংশন, মেথড বা ক্লাসের মতো কলযোগ্য অবজেক্টগুলিতে সাধারণ পরিবর্তন করতে দেয়। আমরা এই টিউটোরিয়ালটির জন্য ফাংশনগুলি নিয়ে কাজ করব। নিম্নোক্ত সিন্ট্যক্সটি
@decorator
def functions(arg):
return "value"
নিচের মতোই
def function(arg):
return "value"
function = decorator(function) # this passes the function to the decorator, and reassigns it to the functions
আপনি যেমনটি দেখেছেন, ডেকোরিটারটি হ’ল অন্য একটি ফাংশন যা একটি ফাংশন নেয় এবং এটিকে রিটার্ন দেয়। উদাহরণস্বরূপ, আপনি এটি করতে পারেন:
def repeater(old_function):
def new_function(*args, **kwds):
old_function(*args, **kwds) # we run the old function
old_function(*args, **kwds) # we do it twice
return new_function # we have to return the new_function, or it wouldn't reassign it to the value
এটি একটি ফাংশনকে দু’বার পুনরাবৃত্তি করাবে।
>>> @repeater
def multiply(num1, num2):
print(num1 * num2)
>>> multiply(2, 3)
6
6
আপনি এটির দ্বারা আউটপুট পরিবর্তন করতেও পারেন
def double_out(old_function):
def new_function(*args, **kwds):
return 2 * old_function(*args, **kwds) # modify the return value
return new_function
এর দ্বারা ইনপুট পরিবর্তন করা
def double_Ii(old_function):
def new_function(arg): # only works if the old function has one argument
return old_function(arg * 2) # modify the argument passed
return new_function
ডেকোরেটর দ্বারা চেকিং করা।
def check(old_function):
def new_function(arg):
if arg < 0: raise (ValueError, "Negative Argument") # This causes an error, which is better than it doing the wrong thing
old_function(arg)
return new_function
ধরা যাক আপনি ভেরিয়েবলের পরিমাণ দিয়ে আউটপুটকে গুণ করতে চান। আপনি ডেকোরেটরকে সংজ্ঞায়িত করবেন এবং নীচের কোডটি ব্যবহার করবেন:
def multiply(multiplier):
def multiply_generator(old_function):
def new_function(*args, **kwds):
return multiplier * old_function(*args, **kwds)
return new_function
return multiply_generator # it returns the new generator
# Usage
@multiply(3) # multiply is not a generator, but multiply(3) is
def return_num(num):
return num
# Now return_num is decorated and reassigned into itself
return_num(5) # should return 15
ফলাফল:
15
আপনি পুরানো ফাংশন দিয়ে যা কিছু করতে চান তা করতে পারেন, এমনকি এটি সম্পূর্ণ উপেক্ষা করতে পারেন! উন্নত ডেকোরেটরগুলো ডকস্ট্রিং এবং আর্গুমেন্ট নম্বরটিও পরিচালনা করতে পারেন। কিছু ডেকোরেটরের জন্য, এখানে এ যান।