2013-03-20 3 views
6

इस परिदृश्य पर विचार करें से उपयोगकर्ताओं को रोकने के है:मैं कैसे एक submodule से एक्स का आयात जब यह माता-पिता में उजागर का उपयोग कर __all__

  • आप एक मॉड्यूल Mm.py एक समारोह f युक्त में परिभाषित किया गया है।

    यह इस तरह कहा जा सकता है:

    import M; 
    M.f() 
    
  • मॉड्यूल एक आकार जहां यह एक एकल फाइल में है करने के लिए अव्यावहारिक है करने के लिए बढ़ता है। आप submodules M.X, M.Y, M.Z में M विभाजित और M/__init__.py में निम्नलिखित डाल:

    from .X import * 
    from .Y import * 
    from .Z import * 
    
    __all__ = ["f"] 
    

    मूल कोड अभी भी काम करता है:

    import M; 
    M.f() 
    

हालांकि, कोड के नए उपभोक्ताओं को गलती से हो सकता है सीधे सबमिशन तक पहुंचें:

import M.X; 
M.X.f() 

मैं इसे रोकना चाहता हूं, जैसे कि सभी कोड अभी भी सीधे एम को संबोधित कर रहे हैं, और कोई भी सबोड्यूल्यूल नहीं है।

submodules आंतरिक कोड संगठन के लाभ के लिए हैं, और एम संदर्भित भविष्य में आसान पुनर्गठन की संभावना छोड़ देता है।

एक विकल्प सबमिड्यूल _X, _Y, और _Z को संवाद करने के लिए होगा कि वे आंतरिक हैं। क्या यह अनुशंसित दृष्टिकोण है?

+4

आप नहीं करते हैं। वह एक समस्या क्यों है? आपका मॉड्यूल अभी भी काम करता है, उन वस्तुओं का उपयोग कर कोड अभी भी काम करता है। –

+0

मैं इसे रोकना चाहता हूं, जैसे कि सभी कोड अभी भी सीधे एम को संबोधित कर रहे हैं, और कोई भी सबोड्यूल्यूल नहीं है। submodules आंतरिक कोड संगठन के लाभ के लिए हैं, और एम संदर्भित भविष्य में आसान पुनर्गठन की संभावना छोड़ देता है। (प्रश्न इस विवरण को शामिल करने के लिए संपादित किया गया है।) –

+3

दस्तावेज करने का सही तरीका है और अपने उपयोगकर्ता पर भरोसा करना आपके सलाह –

उत्तर

1

एक विकल्प सबमिड्यूल _X, _Y, और _Z को संवाद करने के लिए होगा कि वे आंतरिक हैं। क्या यह अनुशंसित दृष्टिकोण है?

जैसा कि आप नहीं चाहते हैं कि लोग एमएक्स एक्सेस करें, आपको X.py मॉड्यूल को स्थानांतरित करने की आवश्यकता होगी, इसलिए यह अब एमएक्स के रूप में उपलब्ध नहीं है। कैई के सुझाव के रूप में आप इसे हटा सकते हैं, लेकिन यूघ। इसलिए हाँ, आपका सुझाव अनुशंसित दृष्टिकोण है।

  1. ले जाएँ M/X.py करने के लिए M/_X.py

  2. M/__init__.py में रेखा है from ._X import f

दूसरों के रूप में सुझाव दिया है, यह वास्तव में एक समस्या यह है कि लोगों को कोड का उपयोग कर सकते नहीं होना चाहिए और यह है आपके पाइथन डिज़ाइनों में घूमते हुए मजबूत encapsulation के साथ एक भाषा में प्रोग्रामिंग की आदतें।

submodules आंतरिक कोड संगठन के लाभ के लिए हैं, और एम संदर्भित भविष्य में आसान पुनर्गठन की संभावना को छोड़ देता है।

हां यह एक चिंता है जब मैं सी और सी ++ से आ रहा था और पूरे दिन एबीआई से निपट रहा था। लेकिन अगर कोड छोटा है और अच्छी तरह से परीक्षण किया जाता है तो यह अक्सर कोई मुद्दा नहीं है। और यह ऐसी चीज है जिसे आप बाद में ठीक से ठीक कर सकते हैं। यदि आप एक दिन X_X के रूप में कोड को पुनर्गठित करने का निर्णय लेते हैं तो मुझे यकीन है कि जेनकींस आपको बता सकता है कि और क्या अपडेट किया जाना चाहिए। :)

0

एक तरीका होता है, लेकिन मुझे नहीं लगता कि आप इसे पसंद करने वाले है:

# M/__init__.py 

from .X import * 
del X 
__all__ = ["x"] 

तुम अब भी import M.X कर सकते हैं, लेकिन जब यह का उपयोग कर त्रुटि फेंक देते हैं।

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