2016-10-19 7 views
11

में __init__.py के लिए मामलों का उपयोग करें अब __init__.pyno longer required एक पैकेज के रूप में मान्यता प्राप्त निर्देशिका बनाने के लिए, क्या यह संभव है कि पूरी तरह से उनसे बचने के लिए सबसे अच्छा अभ्यास है? या क्या अभी भी पाइथन 3.3+ में __init__.py के लिए उपयोग किए जाने वाले उपयोग मामलों हैं?python 3.3+

जो मैं समझता हूं, __init__.py मॉड्यूल आयात समय (for example पर पैकेज की आंतरिक फ़ाइल संरचना को समाहित करने या कुछ प्रारंभिक चरणों को करने के लिए कोड) चलाने के लिए आमतौर पर उपयोग किया जाता था। क्या ये उपयोग अभी भी पाइथन 3.3+ के साथ प्रासंगिक हैं?

+1

'__init __। Py' का उपयोग जारी रखने के लिए, मुझे देखने का एकमात्र असली कारण पीछे की संगतता के लिए है। –

+0

@leaf तो [उदाहरण] (http://stackoverflow.com/a/29509611/336527) के बारे में क्या मैंने उल्लेख किया? Python 3.3+ में ऐसा करने के लिए एक कैननिक तरीका क्या है? – max

उत्तर

2

this answer में इस बात का बहुत अच्छी चर्चा नहीं है, और आप शायद अंतर के बीच और नियमित संकुल स्पष्ट करने के लिए PEP 420 से परिचित होना चाहिए (__init__.py का उपयोग करें) और नाम स्थान संकुल (नहीं करते हैं)।

मैं उत्तर के माध्यम से जो पेशकश करता हूं वह पढ़ने, संदर्भ और राय का संयोजन है। यहां "कैननिकल" या "पायथनिक" होने का कोई दावा नहीं है।

क्या [प्रारंभिक] पाइथन 3.3+ के साथ अभी भी प्रासंगिक मामलों का उपयोग कर रहे हैं?

हाँ। उपयोग के मामले के रूप में अपना example लें, जहां पैकेज लेखक रूट आइटम नामस्थान में कई चीजें लाने के लिए चाहता है ताकि उपयोगकर्ता को अपनी आंतरिक संरचना से खुद को चिंता न करें।

एक और मामला मॉड्यूल के hierarchy बना रहा है। यही कारण है कि संदर्भ (ओ रेली) वास्तव में कहते हैं:

__init__.py फ़ाइलों के प्रयोजन के वैकल्पिक प्रवर्तन कोड एक पैकेज के रूप में विभिन्न स्तरों सामना होता है चलाता है कि शामिल करने के लिए है।

वे पाते हैं कि चर्चा में नाम स्थान संकुल पर विचार करते हैं, लेकिन जारी रखने के लिए: अगर आप सिर्फ एक नए पैकेज के निर्माण के साथ बाहर शुरू कर रहे हैं

सभी बातों के समान होने के नाते, __init__.py फ़ाइलों में शामिल हैं।

तो, आपके दूसरे प्रश्न के लिए,

यह पूरी तरह संभव हो तो __init__.py से बचने के लिए सबसे अच्छा अभ्यास है?

नहीं, जब तक आपका मंतव्य एक नियमित रूप से पैकेज के बजाय एक नाम स्थान पैकेज बनाने के लिए है, जो मामले में आप नहीं करना चाहिए उपयोग __init__.py

आप ऐसा क्यों चाहते हैं?ओ रेली संदर्भ है स्पष्ट example के बारे में मैं क्यों नाम स्थान संकुल शांत कर रहे हैं, जो पतन करने में सक्षम किया जा रहा है अलग, स्वतंत्र रूप से बनाए रखा संकुल से नामस्थान देखा है:

foo-package/ 
    spam/ 
     blah.py 

bar-package/ 
    spam/ 
     grok.py 

कौन सा

>>> import sys 
>>> sys.path.extend(['foo-package', 'bar-package']) 
>>> import spam.blah 
>>> import spam.grok 
>>> 
की अनुमति देता है

तो कोई भी नाम कोड अपने कोड के साथ बढ़ा सकता है। ठंडा।

+0

फिर, शायद, जब भी संभव हो _packages_ से बचने के लिए सबसे अच्छा अभ्यास है, और इसके बजाय _namespaces_ का उपयोग करें? या उस दृष्टिकोण के साथ कुछ समस्या है? – max

+0

ऐसा लगता है कि नामस्थान का लाभ यह है कि वे एक्स्टेंसिबल हैं। उनका नुकसान यह है कि आप उनमें '__init __। Py' नहीं रख सकते हैं और इसलिए कुछ चीजें नहीं कर सकते हैं (जैसे फ़ाइल संरचना को encapsulating, प्रारंभिक प्रदर्शन आदि)। क्या यह सही लगता है? – max