2012-11-19 19 views
11

इस रूप में की उम्मीदमैं फ़ंक्शन में `आयात *` का उपयोग क्यों नहीं कर सकता?

def outer_func(): 
    from time import * 

    print time() 

outer_func() 

मैं संदर्भ ठीक में नेस्टेड कार्यों को परिभाषित और उन्हें अन्य नेस्टेड कार्यों से कॉल कर सकते हैं काम करता है:

def outer_func(): 
    from time import time 

    def inner_func(): 
     print time() 

    inner_func() 

outer_func() 
:

def outer_func(): 
    def time(): 
     return '123456' 

    def inner_func(): 
     print time() 

    inner_func() 

outer_func() 

मैं भी व्यक्तिगत कार्यों आयात कर सकते हैं

हालांकि, SyntaxError: import * is not allowed in function 'outer_func' because it contains a nested function with free variables फेंकता है:

def outer_func(): 
    from time import * 

    def inner_func(): 
     print time() 

    inner_func() 

outer_func() 

मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है, लेकिन यह क्यों काम नहीं करता है?

+1

दिलचस्प सवाल ... – mgilson

+0

"यह अपेक्षित काम करता है" - जिसमें पाइथन संस्करण है? – georg

+0

@ thg435 पायथन 2. पायथन 3 कठोर है और 'सिंटेक्स त्रुटि: आयात * केवल मॉड्यूल स्तर पर अनुमत' के साथ पहला उदाहरण मना कर देता है। मैंने स्पष्टीकरण के लिए पायथन-2.x टैग जोड़ा है। –

उत्तर

22

कंपाइलर को यह जानने का कोई तरीका नहीं है कि समय मॉड्यूल निर्यात वस्तुओं को time नाम दिया गया है या नहीं।

घोंसला वाले कार्यों के मुक्त चर संकलन समय पर बंद कोशिकाओं से बंधे होते हैं। क्लोजर सेल स्वयं संकलित कोड में परिभाषित (स्थानीय) चर को इंगित करते हैं, ग्लोबल्स के विपरीत, जो बिल्कुल बंधे नहीं होते हैं। python data model देखें; फ़ंक्शन func_globals विशेषता के माध्यम से उनके ग्लोबल्स का संदर्भ लेते हैं, और func_closure विशेषता में क्लोजर सेल (या None) का अनुक्रम होता है।

इस तरह, आप एक नेस्टेड स्कोप में गतिशील आयात विवरण का उपयोग नहीं कर सकते हैं।

और नेस्टेड फ़ंक्शंस को क्लोजर सेल की आवश्यकता क्यों है? क्योंकि आप एक तंत्र की जरूरत है स्थानीय समारोह चर का उल्लेख करने के समारोह में ही समाप्त हो गया जब गया है:

def foo(spam): 
    def bar(): 
     return spam 
    return bar 

afunc = foo('eggs') 

foo() बुला करके मैं एक नेस्टेड समारोह है कि एक दायरे वाले चर को संदर्भित करता है प्राप्त की, और संकलक के लिए आवश्यक संदर्भ बनाने की जरूरत है दुभाषिया फिर से उस स्कोप्ड चर को पुनः प्राप्त करने में सक्षम होने के लिए। इसलिए कोशिकाओं, और उन पर लगाई गई सीमाएं।