2010-03-02 7 views
60

का उपयोग करके मुझे अपनी परियोजनाओं में पाइथन की __init__.py फ़ाइलों के उपयोग परिदृश्य या डिजाइन लक्ष्यों को समझने में कठिनाई हो रही है।__init__.py

मान लें कि मैं 'मॉडल' निर्देशिका है (एक पैकेज के रूप में संदर्भित करता है) जो निम्न फ़ाइलें

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py
शामिल

  1. मैं आम एक परिभाषा जो solrmodel.py, mongomodel.py, samodel.py में इस्तेमाल किए जाने की आवश्यकता है:

    मैं __init__.py का उपयोग कर के दो तरीके पाया। क्या मैं सभी * model.py कक्षाओं के लिए आधार/सामान्य परिभाषा के रूप में __init__.py का उपयोग कर सकता हूं? इसका मतलब है कि मुझे model/__init__.py आयात करना है।

  2. या, __init__.py अपनी ही में solrmodel.py, mongomodel.py, samodel.py की परिभाषा आयात किया है होगा और यह वर्ग के लिए आसान आयात या समारोह इस तरह की अनुमति देता है:

    # file: __init__.py 
    
    from mongomodel import * 
    from solrmodel import * 
    from samodel import * 
    

    (मैं जानकारी है कि import * अनुशंसित नहीं है और मैं सिर्फ एक सम्मेलन के रूप में यह प्रयोग किया जाता है)

मैं दो स्थितियों से ऊपर के बीच तय नहीं कर सका। __init__.py के लिए और अधिक उपयोग परिदृश्य हैं और क्या आप उपयोग की व्याख्या कर सकते हैं?

+1

ऐसा लगता है जैसे स्टैक ओवरफ्लो को मार्कडाउन प्रतिपादन में समस्या है। इसे संपादित करते समय \ __ init__.py दिखाता है लेकिन इसे प्रदर्शित करते समय _init_.py दिखाता है। क्या कोई \ __ init__.py सम्मेलन को ठीक कर सकता है? –

+11

इसे कोड ब्लॉक में रखने के लिए बैकटिक्स का उपयोग करें, जैसे: '\' __init __। Py \ ''। या \ _ \ _ init \ _ \ _। py के लिए \\ _ \\ _ \\ _ init \\ _ \\ _। py' का उपयोग करें। अंडरस्कोर का उपयोग इटालिसिसिंग के लिए किया जाता है। – Ponkadoodle

उत्तर

47

__init__.py फ़ाइलों का विशाल बहुमत मैं खाली हूं, क्योंकि कई पैकेजों में प्रारंभ करने के लिए कुछ भी नहीं है।

एक उदाहरण जिसमें मैं प्रारंभ करना चाहता हूं वह है जब पैकेज लोड समय पर मैं डेटा के एक समूह में एक बार और सभी के लिए पढ़ना चाहता हूं (फाइलों, डीबी, या वेब, कहें) - इस मामले में यह अधिक nicer पैकेज को __init__.py में एक अलग "प्रारंभिक मॉड्यूल" के बजाय एक निजी फ़ंक्शन में पढ़ने के लिए और पैकेज में हर एक वास्तविक मॉड्यूल से अनावश्यक रूप से आयात करने के लिए nicer (बेकार रूप से दोहराव और त्रुटि-प्रवण: यह स्पष्ट रूप से एक है जिस मामले में भाषा की गारंटी पर निर्भर है कि पैकेज का __init__.py पैकेज में किसी भी मॉड्यूल से पहले लोड हो गया है, यह स्पष्ट रूप से बहुत अधिक पाइथोनिक है!)।

राय के अन्य ठोस और आधिकारिक अभिव्यक्तियों के लिए, पाइथन की मानक लाइब्रेरी के विभिन्न पैकेजों में किए गए विभिन्न दृष्टिकोणों को देखें।

+2

पिलोन मॉडल को __init__.py के अंदर रखने की सलाह देते हैं। क्या यह ठीक है? क्या यह है वास्तव में मॉडल को इस तरह से शुरू करें? –

+8

व्यक्तिगत रूप से, मैं '__init __। py' में पर्याप्त कोड नहीं डालूंगा, लेकिन इससे बचने के लिए कोई गहरा कारण नहीं है - यह पूरी तरह स्टाइल पसंद है। उस फ़ाइल में सभी कोड पहले निष्पादित किए जाते हैं जब आप पैकेज आयात करते हैं, या पैकेज से कोई मॉड्यूल आयात करते हैं। –

+0

मेरे पास Django विचारों में वैश्विक चर के बारे में एक प्रश्न है। कृपया अपने विचार प्रदान कर सकते हैं? http://stackoverflow.com/questions/39490843/django-app-level- चर –

22

__init__.py की सामग्री आयात की जाती है जब आप पैकेज में मॉड्यूल आयात करते हैं।

आप एक तीसरे परिदृश्य को देख रहे हैं, जो सामान्य भागों को एक अलग मॉड्यूल में रखना है और उसके बाद अन्य मॉड्यूल आयात करते हैं, जो __init__.py को उन चीज़ों के लिए छोड़ते हैं जो पैकेज के बाहर उपयोग किए जाएंगे। यह वह अभ्यास है जिसका मैं आमतौर पर पालन करता हूं।

+1

मुझे काफी समझ में नहीं आता है। क्या आप तीसरे परिदृश्य के लिए एक उदाहरण प्रदान कर सकते हैं? –

+3

@ टाइलर लांग, उसका मतलब है कि एक अलग प्रारंभिक मॉड्यूल (fe 'बूटस्ट्रैप 'और पैकेज के' __init __। Py' में 'आयात बूटस्ट्रैप' को कॉल करना है। – warvariuc