def my_timer(orig_func):
    """returns time orig_func took to run"""
    import time

    def wrapper(*args, **kwargs):
        t1 = time.time()
        result = orig_func(*args, **kwargs)
        t2 = time.time() - t1
        print('{} ran in: {} sec'.format(orig_func.__name__, t2)) # this is interpreted second
        return result # this is interpreted first
    return wrapper

@my_timer
def display_info(name, age):
    print('display_info ran with arguments ({}, {})'.format(name, age))


display_info("Aldona", 22)

मैं उम्मीद करता हूं कि यह रैपर पहले प्रिंट स्टेटमेंट चलाएगा, फिर result वेरिएबल लौटाएगा जिसमें फ़ंक्शन का मान होता है। ऐसा क्यों नहीं है?

-4
Bartek 15 सितंबर 2019, 19:10

1 उत्तर

सबसे बढ़िया उत्तर

आप गलत समझ रहे हैं कि प्रिंटआउट कहां हो रहा है। आपका display_info फ़ंक्शन अपने परिणाम प्रिंट करता है, और कुछ भी उपयोगी नहीं लौटाता है (यह डिफ़ॉल्ट रूप से None लौटाता है)। तो wrapper में, यह orig_func(...) कॉल है जिसके कारण आपके समय संबंधी print कॉल से पहले प्रिंटआउट हो जाता है।

यदि आप चाहते हैं कि आउटपुट का क्रम आपकी अपेक्षाओं से मेल खाए, तो आपको डेकोरेटर कोड बदलने की आवश्यकता नहीं है, इसके बजाय आपको display_info को return में बदलने की जरूरत है, जो इसे बनाता है, और कॉलिंग कोड को बदलना है। करने के लिए print(display_info(...))। लेकिन तब आप display_info फ़ंक्शन का नाम बदलना चाह सकते हैं क्योंकि यह स्वयं कोई प्रदर्शित नहीं करता है ....

0
Blckknght 15 सितंबर 2019, 16:16