2012-06-07 11 views
9

मैं अपने एप्लिकेशन चलाने के हिस्से के रूप में दूरस्थ डेटाबेस से एक शब्दकोश बनाता हूं। यह प्रक्रिया सुंदर I/O भारी है, इसलिए मैंने इस शब्दकोश का "सिंगलटन" उदाहरण बनाने का निर्णय लिया है और इसे केवल मेरे आवेदन में जरूरी है क्योंकि इसे कॉल करें।एक अजगर मॉड्यूल एक सिंगलटन की तरह क्यों कार्य करता है?

state_code_dict = None 

def get_state_code_dict(): 
    global state_code_dict 
    if state_code_dict == None: 
     state_code_dict = generate_state_code_dict() 
    return state_code_dict 

मैं तो आयात और फोन get_state_code_dict() समारोह जहां जरूरत:

कोड की तरह (Dictionaries.py में) लग रहा है। मैंने यह जांचने के लिए एक प्रिंट स्टेटमेंट जोड़ा कि state_code_dict को पुन: प्रारंभ या पुन: उपयोग किया जा रहा था, और मैंने पाया कि इसे पुन: उपयोग किया जा रहा था (जो कार्यक्षमता मैं चाहता हूं)। आवेदन चलाने से state_code_dict का उदाहरण क्यों चल रहा है?

संपादित

मैं एकाधिक फ़ाइलों में get_state_code_dict समारोह आयात करते हैं।

+0

क्योंकि आयातित कोड केवल पहली बार निष्पादित किया जाता है? – KurzedMetal

+0

स्पष्ट करने के लिए संपादित: मैं एकाधिक स्थानों में कोड आयात करता हूं (एकाधिक फ़ाइलों में 'get_state_code_dict' फ़ंक्शन शामिल है। –

+1

दुभाषिया पहले से लोड किया गया कोड आयात करना डिफ़ॉल्ट रूप से उस कोड को फिर से लोड नहीं करेगा।जानबूझकर मॉड्यूल को फिर से लोड करना संभव है, लेकिन यदि आपको किसी भी कारण से ऐसा करना है क्योंकि मॉड्यूल का वास्तविक कोड रनटाइम के दौरान बदल सकता है, तो संभवतः आपको ऐसा करने के लिए एक अलग प्रोग्रामिंग मुहावरे का उपयोग करना चाहिए। –

उत्तर

16

यह how importing a module works का अजगर भाषा संदर्भ के वर्णन है:

(1) एक मॉड्यूल मिल जाए, और यह प्रारंभ यदि आवश्यक हो तो; (2) स्थानीय नाम स्थान

में एक नाम या नाम को परिभाषित (जोर जोड़ा।) यहाँ, आरंभ एक मॉड्यूल अपने कोड को क्रियान्वित करने का मतलब है। यह निष्पादन केवल किया जाता है यदि आवश्यक हो तो, यानी यदि मॉड्यूल वर्तमान प्रक्रिया में पहले आयात नहीं किया गया था। चूंकि पाइथन मॉड्यूल प्रथम श्रेणी के रनटाइम ऑब्जेक्ट्स हैं, इसलिए वे प्रभावी रूप से सिंगलटन बन जाते हैं, जो पहले आयात के समय शुरू होते थे।

ध्यान दें कि इसका मतलब है कि get_state_dict_code फ़ंक्शन की कोई आवश्यकता नहीं है; सिर्फ शीर्ष-स्तर पर state_code_dict प्रारंभ:

state_code_dict = generate_state_code_dict() 

एक अधिक गहराई से स्पष्टीकरण के लिए, this talk by Thomas Wouters देखते हैं, esp। पहला भाग - लगभग 04:20 - जहां उन्होंने "सब कुछ रनटाइम" सिद्धांत पर चर्चा की।

+0

+1। –

+0

क्या मैं 'आयात शब्दकोश' कॉल करके राज्य_code_dict प्राप्त करूंगा; state_code_dict = शब्दकोश .state_code_dict'? –

+0

@ टाइटलरविट: हाँ। या idiomatic 'शब्दकोश से आयात राज्य_code_dict'। –

10

मैंने लार्सन का जवाब दिया, मैं बस एक उदाहरण जोड़ना चाहता था।

hello.py:

hi = 'hello' 

print(hi) 

def print_hi(): 
    print(hi) 

IPython सत्र:

In [1]: from hello import print_hi 
hello 

In [2]: print_hi() 
hello 

In [3]: from hello import print_hi 

In [4]: import hello 

In [5]: hello.print_hi() 
hello 


देखो कि लाइनों 3 और 4 में आयात नहीं कर उत्पादन "हैलो" के रूप में लाइन 1 में आयात किया गया, इसका मतलब है कि कोड फिर से निष्पादित नहीं किया गया है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^