2010-02-02 12 views
21

मैंने इसे पाइथन/लिब सोर्स कोड में बहुत कुछ देखा है, लेकिन मुझे नहीं पता कि यह क्या है।पाइथन __all__ मॉड्यूल स्तर चर के लिए क्या है?

मैंने सोचा कि इसका उपयोग मॉड्यूल के सुलभ सदस्यों को सीमित करने के लिए किया गया था। तो dir(module) पर केवल __all__ पर तत्व दिखाई देंगे।

मैंने थोड़ा उदाहरण दिया और देखा कि यह मेरी अपेक्षा के अनुसार काम नहीं कर रहा था।

तो ... पाइथन __all__ मॉड्यूल स्तर चर के लिए क्या है?

+4

इसी प्रकार का प्रश्न यहां: http://stackoverflow.com/questions/44834/can-someone-explain-all-in-python –

उत्तर

43

देखें यह दो उद्देश्यों है:

  1. जो कोई भी स्रोत पढ़ता है क्या उजागर पता चल जाएगा सार्वजनिक एपीआई है। यह को निजी घोषणाओं में चारों ओर घूमने से रोकता है, लेकिन यह अच्छी चेतावनी प्रदान नहीं करता है।

  2. जब from mod import * का उपयोग कर, केवल __all__ में सूचीबद्ध नाम आयात किया जाएगा। यह मेरी राय में उतना महत्वपूर्ण नहीं है, क्योंकि सब कुछ आयात करना वास्तव में खराब विचार है। जब उपयोगकर्ता from sound.effects import * लिखते

+7

कोई भी नहीं, कुछ भी। कुछ एपीआई दस्तावेज उपकरण '__all__' का सम्मान करते हैं। pydoc करता है, और मुझे यकीन है कि epydoc और पसंद भी है। – mzz

+0

'में सार्वजनिक चर।py 'एक अन्य फ़ाइल में उपलब्ध है जब हम' आयात * 'करते हैं, भले ही वे __all __ में शामिल न हों। क्या कोई इस बारे में स्पष्टीकरण दे सकता है ..? – Alchemist777

+0

स्फिंक्स भी '__all__'' का सम्मान करता है – Rafe

4

यह नियंत्रित होता है कि आप अपने namepsace में खींच लिया हो जब तुम

from blah import * 

Importing * from a Package

7

http://docs.python.org/tutorial/modules.html#importing-from-a-package

अब क्या होता है? आदर्श रूप से, कोई उम्मीद करेगा कि यह किसी भी तरह से फाइल सिस्टम पर चला जाता है, यह पता चलता है कि पनडुब्बी पैकेज में मौजूद हैं और उन सभी को आयात करता है। यह को लंबे समय तक ले सकता है और उप-मॉड्यूल आयात करने से अवांछित दुष्प्रभाव हो सकते हैं जो केवल तभी होना चाहिए जब उप-मॉड्यूल स्पष्ट रूप से आयात किया गया हो।

पैकेज का एकमात्र समाधान लेखक के लिए पैकेज की एक स्पष्ट अनुक्रमणिका प्रदान करने के लिए है। इंपोर्ट स्टेटमेंट का उपयोग करता है इन नियमों का पालन: अगर एक पैकेज के __init__.py कोड एक सूची __all__ नामित परिभाषित करता है, यह मॉड्यूल नामों की सूची है कि जब from package import * का सामना करना पड़ा है आयातित किया जाना चाहिए होने के लिए लिया जाता है। पैकेज के रिलीज को जारी करने के लिए यह अद्यतित रखने के लिए पैकेज लेखक पर निर्भर है। पैकेज लेखक पर इसका समर्थन न करने का भी निर्णय ले सकते हैं, तो उन्हें अपने पैकेज से * आयात करने के लिए उपयोग नहीं दिखाई देता है।

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