2012-08-14 18 views
12

मैं इस पैकेज है:अजगर एक ही निर्देशिका में मॉड्यूल के लिए पूर्ण आयात

mypackage/ 
    __init__.py 
    a.py 
    b.py 

और मैं ख मॉड्यूल मॉड्यूल एक से बातें आयात करना चाहते हैं, यह भावना पड़ता है मॉड्यूल में लिखने के लिए

from mypackage.a import * 

या मैं सिर्फ

from a import * 

दोनों विकल्पों के लिए काम करेंगे का उपयोग करना चाहिए, मैं बस सोच रहा हूँ बेहतर (2 बनाता है जो समझें क्योंकि यह एक ही स्तर पर है लेकिन मैं टकराव से बचने के लिए पहले 1 पर विचार कर रहा हूं, उदाहरण के लिए यदि सिस्टम उस फ़ोल्डर से चल रहा है जिसमें a.py नाम की फ़ाइल है)।

उत्तर

6

आप सुरक्षित रूप से नंबर 2 का उपयोग कर सकते हैं क्योंकि कोई टकराव नहीं होना चाहिए - आप हमेशा एक ही पैकेज से वर्तमान मॉड्यूल के रूप में एक मॉड्यूल आयात करेंगे। कृपया ध्यान दें, कि यदि आपके मॉड्यूल का मानक लाइब्रेरी मॉड्यूल में से एक जैसा ही नाम है, तो इसे मानक के बजाय आयात किया जाएगा।

जब spam नाम के एक मॉड्यूल आयात किया जाता है, दुभाषिया पहले खोजें उस नाम का कोई अंतर्निहित मॉड्यूल के लिए: the documentation से। यदि नहीं मिला, तो परिवर्तनीय sys.path द्वारा दी गई निर्देशिकाओं की सूची में spam.py नाम की फ़ाइल के लिए खोजें। sys.path इन स्थानों से आरंभ नहीं हो जाता:

  • निर्देशिका इनपुट स्क्रिप्ट (या वर्तमान निर्देशिका) युक्त।
  • PYTHONPATH (निर्देशिका नामों की एक सूची,
  • शैल चर PATH के समान वाक्यविन्यास के साथ)।
  • स्थापना-निर्भर डिफ़ॉल्ट।

प्रारंभ करने के बाद, अजगर कार्यक्रमों sys.path संशोधित कर सकते हैं। निर्देशिका जिसमें स्क्रिप्ट चल रहा है, मानक लाइब्रेरी पथ से पहले, खोज पथ के पर स्थित है। इसका अर्थ है कि उस निर्देशिका में स्क्रिप्ट्स के मॉड्यूल के बजाय लाइब्रेरी निर्देशिका में समान नाम लोड की जाएंगी। यह एक त्रुटि है जब तक कि प्रतिस्थापन का इरादा नहीं है। अधिक जानकारी के लिए खंड Standard Modules देखें।

विकल्प from mypackage.a import * का उपयोग पूरे परियोजना में स्थिरता कारणों के लिए किया जा सकता है। कुछ मॉड्यूल में आपको वैसे भी पूर्ण आयात करना होगा। इस प्रकार आपको यह नहीं सोचना होगा कि मॉड्यूल एक ही पैकेज में है या नहीं और पूरी परियोजना में एक समान शैली का उपयोग करें। इसके अतिरिक्त यह दृष्टिकोण अधिक विश्वसनीय और अनुमानित है।

Python style guidelines रिश्तेदार आयात उपयोग करने की अनुशंसा नहीं है:

इंट्रा-पैकेज के आयात के लिए सापेक्ष आयात अत्यधिक हतोत्साहित किया जाता है। हमेशा सभी आयातों के लिए पूर्ण पैकेज पथ का उपयोग करें।अब भी PEP 328 पाइथन 2.5 में पूरी तरह कार्यान्वित किया गया है, इसकी स्पष्ट की शैली की शैली सक्रिय रूप से हतोत्साहित है; पूर्ण आयात पोर्टेबल और आमतौर पर अधिक पठनीय हैं।

चूंकि पाइथन 2.5 intra-package relative imports के लिए एक नया वाक्यविन्यास पेश किया गया है। वर्तमान मॉड्यूल और .. को संदर्भित करने के लिए अब आप . कर सकते हैं और मॉड्यूल को ऊपर 1 स्तर का संदर्भ दिया जा रहा है।

from . import echo 
from .. import formats 
from ..filters import equalizer 
+3

और आप कैसे जानते हैं कि जो भी 'ए' वास्तव में है, वह बिल्टिन के साथ टकराव नहीं है? किसी कारण से लागू सापेक्ष आयात मारे गए, वे सुरक्षित नहीं हैं। – MatthewWilkes

+0

आप सही हैं, एक बिल्टिन मॉड्यूल को हमारे नाम के साथ ही एक ही नाम के साथ मुखौटा बनाया जाएगा। –

+0

"पायथन शैली दिशानिर्देश पहले दृष्टिकोण की अनुशंसा नहीं करते हैं:" मेरे लिए ऐसा लगता है कि वे पहले "सभी आयातों के लिए हमेशा पूर्ण पैकेज पथ का उपयोग करें" – banana

5

आपको from mypackage.a import things, you, want का उपयोग करना चाहिए।

यहां दो मुद्दे हैं, मुख्य एक सापेक्ष बनाम पूर्ण आयात है, जिसमें सेमेन्टिक्स पाइथन 3 में बदल गया है, और वैकल्पिक रूप से __future__ आयात का उपयोग करके पाइथन 2.6 और 2.7 में उपयोग किया जा सकता है। Mypackage.a का उपयोग करके आप गारंटी देते हैं कि आपको वह कोड मिलेगा जो आप वास्तव में चाहते हैं, और यह पाइथन के भविष्य के संस्करणों पर भरोसेमंद काम करेगा।

दूसरी बात यह है कि आपको आयात * से बचना चाहिए, क्योंकि यह संभावित रूप से अन्य कोड मास्क कर सकता है। क्या होगा यदि a.py फ़ाइल ने sum नामक फ़ंक्शन प्राप्त किया है? यह चुपचाप बिल्टिन ओवरराइड होगा। अन्य मॉड्यूल में अपना कोड आयात करते समय यह विशेष रूप से खराब होता है, क्योंकि आप पुन: उपयोग किए गए चर या फ़ंक्शन नामों का उपयोग कर सकते हैं।

इसलिए, आपको केवल आवश्यक विशिष्ट कार्यों को आयात करना चाहिए। आपके स्रोत कोड पर pyflakes का उपयोग करने से आपको संभावित संघर्ष होने पर चेतावनी दी जाएगी।

+2

+1। बीटीडब्ल्यू, '__future__ से आयात absolute_import' पायथन 2.5 पर भी काम करता है। – jfs

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