ডেকোরেটর

ফাংশন চাপ্টারে আমরা ফাংশন নিয়ে অল্প-বিস্তর ব্যাপক জ্ঞান লাভ করেছি। পাইথনে ফাংশন হল ফার্স্ট-ক্লাস অবজেক্ট। এর মানে হল আমরা ফাংশনকে নরমাল ভ্যালু বা ভ্যারিয়েবলের মত করে পাস করতে পারি, প্যারামিটার বা আর্গুমেন্ট হিসাবে ব্যবহার করতে পারি। বুঝলাম না মনে হয়। একটা উদাহরণ দেখা যাক।

def get_int_as_str(number):
    return str(number)

def print_int(my_function, number):
    print(my_function(number))
    return

print_int(get_int_as_str, 130)

আউটপুট

130

এখানে আমরা print_int() ফাংশনের ভিতর get_int_as_str() ফাংশনকে আর্গুমেন্ট হিসাবে পাস করেছি। পরে সেটা দিয়ে কোডিং কারিশমা দেখাইছি। এ তো গেল ফাংশনকে আর্গুমেন্ট হিসাবে পাস করার কথা। যদি ফাংশনকেই রিটার্ন করতে চাই? এও কি সম্ভব! হুম, সব সম্ভবের পাইথনে সবই সম্ভব।

def get_int_as_str(number):
    print(str(number))
    return

def print_int(my_function, number):
    return my_function(number)

print_int(get_int_as_str, 130)

আউটপুট

130

এখানে আমরা print_int() ফাংশনের ভিতর get_int_as_str() ফাংশনকে ও একটা ইন্টিজার ভ্যালুকে আর্গুমেন্ট হিসাবে পাস করেছি। print_int() ফাংশনের রিটার্ন অংশে আবার get_int_as_str() ফাংশনকে রিটার্ন করেছি। এইক্ষেত্রে একটা কাহিনি আছে। get_int_as_str() ফাংশনটা রিটার্ন হবার সময় এক্সিকিউট হওয়া শুরু করে। তাই দিনশেষে get_int_as_str() ফাংশন যা রিটার্ন করে print_int() ফাংশনও তাই রিটার্ন করে।

আমরা কিন্তু চাইলে get_int_as_str() ফাংশনটাকে print_int() ফাংশনের ভিতরেই ডিফাইন করতে পারতাম।

def print_int(number):

    def get_int_as_str(number):
        print(str(number))
        return

    get_int_as_str(number)
    return

print_int(130)

আউটপুট

130

উপরের প্রোগ্রামটাকে আরেকটু মডিফাই করে নিচের চেহারা দিতে পারি আমরা।

def print_int(number):

    def get_int_as_str(number):
        print(str(number))
        return

    return get_int_as_str(number)

print_int(130)

আউটপুট

130

নিজেদের অজান্তেই কিন্তু আমরা একটা ডেকোরেটর লিখে ফেলেছি। এইক্ষেত্রে print_int() হল ডেকোরেটর। পাইথনের ভাষায়, ডেকোরেটর হল এমন একটা ফাংশন যা অন্য কোন ফাংশনের কার্যপরিধি কোন প্রকার মডিফিকেশন ছাড়াই এক্সটেন্ড করে। ডেকোরেটর লেখার সিনট্যাক্স হল @decorator_name। উপরের প্রোগ্রামটাকে এখন আমরা এভাবে লিখতে পারি।

def print_int(my_function):

    def any_function():
        return my_function

    return any_function()

@print_int
def get_int_as_str(number):
    print(str(number))
    return

get_int_as_str(130)

আউটপুট

130

বুঝলাম সবাই? ডেকোরেটর তো বুঝলাম। কিন্তু এর সুবিধা তো বোধগম্য হল না। এরজন্য আমরা আরেকটা প্রোগ্রাম দেখব। আমরা এখন একটা ডেকোরেটর ফাংশন লিখব যেটা কোন ফাংশন এক্সিকিউট হতে কত সময় নেয় তা জাতিরে জানান দিবে। এইক্ষেত্রে পাইথন স্টান্ডার্ড মডিউল time এর time() ফাংশনের সহায়তা নেব আমরা।

from time import time

def timer(any_function):
    def count_time():
        start = time()
        any_function()
        stop = time()
        print(stop-start, 'seconds')
        return
    return count_time

@timer
def hello():
    print('Hello World!')
    return

@timer
def another_function():
    for item in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
        print(item)
    return

hello()
another_function()

আউটপুট

Hello World!
0.006817340850830078 seconds
1
2
3
4
5
6
7
8
9
10
0.041167497634887695 seconds

আশা করি বুঝেছি সবাই। তাহলে এরকম আরো কিছু ডেকোরেটর লিখে প্রাকটিস চালিয়ে যাই।

সহজ ভাষায় পাইথন ৩

বইটি পড়ার সময় প্রতিটি টপিক ধারাবাহিকভাবে বুঝে বুঝে পড়তে হবে এবং হাতে-কলমে অনুশীলন করতে হবে। কোন অংশ বুঝতে সমস্যা হলে ফেসবুক গ্রুপ পাইথন বাংলাদেশে সমস্যাটি পোস্ট করতে পারেন। এখান থেকে অতি দ্রুত সাহায্য-সহযোগীতা পাবেন আপনি।

results matching ""

    No results matching ""