2009-05-22 9 views
10

में मॉड्यूल को उचित रूप से आयात करना मैं मॉड्यूल आयात कैसे सेट करूं ताकि प्रत्येक मॉड्यूल अन्य सभी की वस्तुओं तक पहुंच सके?पाइथन

मेरे पास विभिन्न उपनिर्देशिकाओं में मॉड्यूल फ़ाइलों के साथ एक मध्यम आकार पायथन एप्लिकेशन है। मैंने मॉड्यूल बनाए हैं जो इन उपनिर्देशिकाओं को sys.path पर जोड़ते हैं और import thisModule as tm का उपयोग करके मॉड्यूल के समूह को आयात करते हैं। मॉड्यूल ऑब्जेक्ट्स को उस योग्यता के साथ संदर्भित किया जाता है। मैं फिर उस मॉड्यूल को from moduleImports import * के साथ दूसरों में आयात करता हूं। कोड अभी मैला है और इनमें से कई चीजें हैं, जो अक्सर डुप्लीकेटिव होती हैं।

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

दूसरा, मुझे चिंता है कि मैं रिकर्सिव मॉड्यूल आयात के साथ समस्या पैदा कर रहा हूं। मॉड्यूल आयात करना आयात मॉड्यूल आयात करता है, जो मॉड्यूल आयात करता है। । । ।

ऐसा करने का सही तरीका क्या है?

+0

यह नहीं पता कि यह सीधे आपके प्रश्न का उत्तर देता है, लेकिन [मैंने कुछ दिन पहले आयात करने के बारे में पूछा था) (http://stackoverflow.com/questions/860672/lay-out-import-pathing-in-python- सीधे और सरल)। जवाब बहुत उपयोगी पाया। –

उत्तर

21

"मेरे पास विभिन्न उपनिर्देशिकाओं में मॉड्यूल फ़ाइलों के साथ एक मध्यम आकार पायथन एप्लिकेशन है।"

अच्छा। पूरी तरह से सुनिश्चित करें कि प्रत्येक निर्देशिका में __init__.py फ़ाइल शामिल है, ताकि यह एक पैकेज हो।

बुरा "मैं मॉड्यूल है कि sys.path करने के लिए इन उपनिर्देशिका संलग्न बनाया है"। PYTHONPATH का उपयोग करें या पूरी संरचना Lib/site-packages स्थापित करें। sys.path गतिशील रूप से अपडेट न करें। यह एक बुरी चीज है। प्रबंधन और बनाए रखने के लिए मुश्किल है।

"import thisModule as tm का उपयोग करके मॉड्यूल का एक समूह आयात करता है।"

समझ में नहीं आता है। शायद आपकी संरचना में प्रत्येक मॉड्यूल के लिए आपके पास import thisModule as tm है। यह सामान्य, मानक अभ्यास है: केवल मॉड्यूल आयात करें जो आपको चाहिए, कोई अन्य नहीं।

बुरा "मैं तो उस मॉड्यूल दूसरों में from moduleImports import * के साथ आयात"। कंबल यादृच्छिक सामान का एक गुच्छा आयात मत करो।

प्रत्येक मॉड्यूल में आवश्यक विशिष्ट चीज़ों की एक लंबी सूची होनी चाहिए।

import this 
import that 
import package.module 

स्पष्ट सूची। कोई जादू नहीं sys.path पर कोई गतिशील परिवर्तन नहीं।

मेरी वर्तमान परियोजना में 100 मॉड्यूल, एक दर्जन या तो पैकेज हैं। प्रत्येक मॉड्यूल केवल वही आयात करता है जो इसकी आवश्यकता है। कोई जादू नहीं

+3

एक वाक्य में लपेटना: "स्पष्ट रूप से स्पष्ट स्पष्ट है।" –

3

आपको आयात पर रिकर्सन नहीं मिलेगा क्योंकि पायथन प्रत्येक मॉड्यूल को कैश करता है और पहले से ही इसे पुनः लोड नहीं करेगा।

+1

सर्कुलर आयात वास्तव में हो सकता है उदा। मान लीजिए बी एक फ़ंक्शन को परिभाषित करता है जो एक दूसरे का उपयोग करता है और दोनों एक दूसरे को आयात करते हैं http://www.copypastecode.com/codes/view/5193 –

+0

@Anurag Uniyal: क्या आपने वास्तव में इसका परीक्षण किया है? आयात इस बात का ट्रैक रखता है कि यह आयात करता है इसलिए कोई गारेंटी नहीं है कि वह कोड भी रिकर्सिव लोडिंग का कारण बनता है। – SpliFF

+0

ऐसा होता है मुझे अब सटीक विवरण याद नहीं हैं लेकिन इसमें कुछ मॉड्यूल के साथ कुछ मुख्य रूप से आयात किया गया है और फिर मॉड्यूल –

6

कुछ संकेत दिए गए

  1. आप हो सकता है पहले से ही विभिन्न मॉड्यूल में कार्यक्षमता अलग हो गए। यदि सही ढंग से समय की सबसे किया आप परिपत्र आयात में समस्याओं गिर जाएगी (उदाहरण के लिए अगर मॉड्यूल एक ख और ख पर निर्भर करता है एक पर आप किसी तृतीय मॉड्यूल सी ऐसी परिपत्र निर्भरता को निकालना कर सकते हैं)। अंतिम उपाय के रूप में, आयात बी में लेकिन बी में बिंदु पर आयात करें जहां एक आवश्यकता है उदा। फ़ंक्शन के अंदर।

  2. एक बार कार्यक्षमता एक subdir के तहत संकुल में मॉड्यूल समूह उन में ठीक से है और इसलिए है कि आप पैकेज आयात कर सकते हैं यह करने के लिए एक __init__.py फ़ाइल जोड़ें। ऐसे पैकेज को फ़ोल्डर में रखें उदा। लिब और फिर या तो जोड़ने sys.path या अच्छा विचार हो सकता है नहीं सेट PYTHONPATH env चर

  3. से मॉड्यूल आयात * करने के लिए। इसके बजाय, आयात करें जो भी आवश्यक है। यह पूरी तरह योग्य हो सकता है। यह वर्बोज़ होने से कोई दिक्कत नहीं करता है। जैसे pakageA.moduleB आयात से कूलक्लास।

+0

माइनर स्वरूपण नोट: मेरा मानना ​​है कि आपका मतलब __init__.py है (इसे रोकने के लिए इसके आसपास बैकटिक्स का उपयोग करें बोल्ड में परिवर्तित किया जा रहा है।) –

+0

धन्यवाद, ये सरल प्रारूपण भाषाएं कभी-कभी –

+0

को प्रबंधित करने के लिए जटिल हो जाती हैं, मुझे समझ में नहीं आता कि आप "विभाजन कार्यक्षमता" से क्या मतलब रखते हैं, या कैसे एक तीसरा मॉड्यूल दो मॉड्यूल के बीच परस्पर निर्भरता को हल करने में मदद करेगा। – chernevik

4

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

पायथन (import this) के जेन के रूप में, स्पष्ट है, स्पष्ट रूप से स्पष्ट है।