2010-08-30 22 views
22

मेरे पास पैकेज mypack है जिसमें मॉड्यूल mod_a और mod_b है। मैं पैकेज ही है और mod_a स्वतंत्र रूप से आयात किया जा करने का इरादा:पायथन: पैकेज में 'निजी' मॉड्यूल

import mypack 
import mypack.mod_a 

हालांकि, मैं mypack के अनन्य उपयोग के लिए mod_b रखना चाहते हैं। ऐसा इसलिए है क्योंकि यह केवल बाद के आंतरिक कोड को व्यवस्थित करने के लिए मौजूद है।

मेरा पहला सवाल यह है कि क्या यह पाइथन प्रोग्रामिंग में इस तरह के 'निजी' मॉड्यूल के लिए एक स्वीकार्य अभ्यास है?

यदि हां, मेरा दूसरा सवाल यह है कि क्लाइंट को इस इरादे को व्यक्त करने का सबसे अच्छा तरीका क्या है? क्या मैं अंडरस्कोर के साथ नाम उपसर्ग करता हूं (यानी _mod_b)? या क्या उप-पैकेज private घोषित करना और ऐसे सभी मॉड्यूल को रखने का अच्छा विचार होगा?

उत्तर

13

जिस समाधान पर मैंने समाधान किया है वह उप-पैकेज 'निजी' बनाना है और उन सभी मॉड्यूल को रखना है जहां मैं वहां छिपाना चाहता हूं। इस तरह वे mypack की मॉड्यूल सूची क्लीनर और पार्स के लिए आसान छोड़कर, दूर खड़े रहेंगे।

मेरे लिए, यह अवांछित नहीं दिखता है।

+0

मैं इस पोस्ट में लगभग 6 साल बाद उसी प्रश्न और प्रेरणा के साथ आ रहा हूं जो आपके पास था। क्या निजी उप-पैकेज दृष्टिकोण अभी भी आपके द्वारा लिया गया है या आपने तब से अन्य दृष्टिकोणों की कोशिश की है? –

+2

हां। मैं अभी भी इस विधि का उपयोग कर रहा हूँ। कोई बेहतर विकल्प नहीं मिला है। –

+3

अद्यतन के लिए धन्यवाद और इस दृष्टिकोण को पहली जगह में सुझाव देने के लिए धन्यवाद। मैं "z" के साथ "निजी" उप-पैकेज नाम उपसर्ग करता हूं, ताकि यह आईडीई कोड-समापन ड्रॉपडाउन में अंतिम बार दिखाई दे। मैं केवल "सार्वजनिक" कार्यों का पर्दाफाश करने के लिए उप-पैकेज के '__init __। Py' में सापेक्ष आयात का उपयोग करता हूं। PyCharm और Jupyter में, ड्रॉपडाउन से आंतरिक मॉड्यूल के नाम रखने के लिए, प्रत्येक मॉड्यूल में मॉड्यूल के समान नाम के साथ एक फ़ंक्शन होना चाहिए, और मुझे '__init __। Py' में फ़ंक्शन आयात करना होगा। आप शायद यह सब पहले से ही जानते हैं लेकिन यदि यहां नहीं है तो यह है। अगर आप मुझे जवाब के रूप में विस्तार करना चाहते हैं तो बस मुझे बताएं। –

2

पायथन सख्ती से "निजी" या "संरक्षित" विधियों या कक्षाओं का समर्थन या समर्थन नहीं करता है। एक सम्मेलन है कि एक अंडरस्कोर के साथ प्रीफ़िक्स किए गए तरीके आधिकारिक एपीआई का हिस्सा नहीं हैं, लेकिन मैं कक्षाओं या फ़ाइलों पर ऐसा नहीं करता - यह बदसूरत है।

अगर किसी को वास्तव में mod_b को उपclass या एक्सेस करने की आवश्यकता है, तो उसे ऐसा करने से क्यों रोकें? आप अपने मॉड्यूल में अपने प्रलेखन और दस्तावेज़ में हमेशा एक पसंदीदा एपीआई की आपूर्ति कर सकते हैं कि आपको इसे सीधे एक्सेस नहीं करना चाहिए और स्टीप में माइपैक का उपयोग करना चाहिए।

+3

मैं 'mod_a' की तरह' mod_b' पहुंच योग्य छोड़ सकता था। हालांकि, कल्पना करें कि 'mod_b' के समान 20 मॉड्यूल हैं। तो जब क्लाइंट संपादक में 'mypack.' टाइप करता है, तो इंटेलिजेंस सभी 25 या तो निजी और सार्वजनिक मॉड्यूल सूचीबद्ध करेगा। यह मेरे कोड को तलाशने के लिए कठिन बना देगा। यही कारण है कि मैं उन मॉड्यूल को 'छिपाना' चाहता हूं जो क्लाइंट के लिए नहीं हैं। दस्तावेज़ीकरण के लिए, लोग आम तौर पर दस्तावेज़ीकरण पढ़ने की खोज करना पसंद करते हैं। –

+0

मैट जॉइनर ने कहा, अपने '__init __। Py' में' mod_b' आयात न करें। मेरा सुझाव है कि आप '__all__' विशेष चर को भी देखें। यदि उनमें से कोई भी काम पूरा नहीं करता है, तो समस्या इंटेलिसेंस में है। – ssokolow

+3

ssokolow, मैट के उत्तर के तहत तीसरी टिप्पणी देखें। यहां तक ​​कि जब 'mypack/__ init __। Py' में' mod_b' आयात नहीं किया जाता है, तब भी क्लाइंट कोड में 'mypack.mod_b' आयात करें टाइपिंग सफलतापूर्वक काम करता है।ऐसा इसलिए है क्योंकि पाइथन को "डॉट" आयात (जैसे 'mypack.mod_b') के लिए शीर्ष स्तर वाले नेस्टेड मॉड्यूल के आयात की आवश्यकता नहीं है। –

6

हालांकि स्पष्ट निजी कीवर्ड नहीं हैं, वहां एक सम्मेलन है जो निजी कार्यों को एक अंडरस्कोर से शुरू करता है लेकिन एक डबल अग्रणी अंडरस्कोर इसे बना देगा ताकि अन्य आसानी से मॉड्यूल के बाहर से फ़ंक्शन को कॉल न कर सकें। PEP 8

- _single_leading_underscore: weak "internal use" indicator. E.g. "from M 
    import *" does not import objects whose name starts with an underscore. 

- single_trailing_underscore_: used by convention to avoid conflicts with 
    Python keyword, e.g. 

    Tkinter.Toplevel(master, class_='ClassName') 

- __double_leading_underscore: when naming a class attribute, invokes name 
    mangling (inside class FooBar, __boo becomes _FooBar__boo; see below). 

- __double_leading_and_trailing_underscore__: "magic" objects or 
    attributes that live in user-controlled namespaces. E.g. __init__, 
    __import__ or __file__. Never invent such names; only use them 
    as documented. 

से निम्नलिखित एक पूरे मॉड्यूल निजी बनाने के लिए देखो, यह __init__.py फ़ाइल शामिल नहीं हैं।

+4

एटरेल, "__init __। Py'" में शामिल न होने का क्या मतलब है? क्या मतलब है '__init __। Py' में' आयात mod_b' कथन 'न रखें? यदि ऐसा है, तो वह अभी भी मेरी समस्या का समाधान नहीं करता है। ग्राहक अभी भी सार्वजनिक मॉड्यूल की तरह 'mod_b' आयात कर सकता है:' mypack.mod_b आयात करें '। या आप कुछ और मतलब है? –

+1

तो यह मॉड्यूल को निजी रूप से लागू नहीं करेगा, जैसे एक अंडरस्कोर कमजोर है। लेकिन यह स्पष्ट रूप से आयात किए बिना दिखाई नहीं देता है, जो अभी भी बहुत निजी है। मुझे कल्पना है कि आप फाइल को दो प्रमुख अंडरस्कोर के साथ नाम दे सकते हैं, लेकिन मैंने कभी इसके साथ नहीं खेला है। – aterrel

+1

प्रतिक्रिया प्रतिक्रिया के लिए धन्यवाद। जिस समाधान पर मैं बस रहा हूं वह 'माइपैक' के तहत एक उप-पैकेज 'निजी' बना रहा है और उसमें सभी मॉड्यूल रख रहा है जिन्हें मैं 'छुपा' करना चाहता हूं। यह मेरे कोड को अनदेखा करने के लिए आसान बनाता है (उदाहरण के लिए, इंटेलिजेंस के माध्यम से), सभी uneeded fluff को दूर करके। –

21

मैं उपयोगकर्ता के इरादे को संवाद करने के लिए अंडरस्कोर के साथ निजी मॉड्यूल का उपसर्ग करता हूं। आपके मामले में, यह mypack._mod_b

यह एक ही भावना (लेकिन पूरी तरह से समान नहीं है) पीईपी 8 की सिफारिश है जो एक पाइथन मॉड्यूल द्वारा लिपटे जाने पर एक अग्रणी अंडरस्कोर के साथ सी-एक्सटेंशन मॉड्यूल का नाम देने के लिए है; यानी, _socket और socket

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