2010-03-25 9 views
6

मेरे पास एक पाइथन पैकेज mymodule है जो उप-पैकेज utils (यानी एक उपनिर्देशिका जिसमें प्रत्येक फ़ंक्शन के साथ मॉड्यूल शामिल है)। फ़ंक्शंस में फ़ाइल/मॉड्यूल के समान नाम होता है जिसमें वे रहते हैं।एक ही नाम के पायथन मॉड्यूल से एक फ़ंक्शन/क्लास आयात करना

मैं इस प्रकार के रूप में कार्य का उपयोग कर सकेंगे चाहते हैं,

from mymodule.utils import a_function

अजीब हालांकि, कभी कभी मैं ऊपर अंकन का उपयोग कार्यों लेकिन दूसरी बार मैं नहीं कर सकता आयात कर सकते हैं,। मैं काम करने में सक्षम नहीं हूं क्यों (हाल ही में, उदाहरण के लिए, मैंने एक फ़ंक्शन और फ़ाइल का नाम बदल दिया और इस नाम को utils.__init__.py फ़ाइल में प्रतिबिंबित किया लेकिन यह अब एक फ़ंक्शन (बल्कि मॉड्यूल के रूप में) के रूप में आयात नहीं किया गया है

मेरी स्क्रिप्ट के। utils.__init__.py कुछ इस तरह पढ़ी,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.pyutils

विचार के लिए कोई संदर्भ है?

उत्तर

7

अपने utils कार्यों की जरूरत है अन्य utils कार्यों को आयात करें? (या अन्य मॉड्यूल आयात करें जो अन्य यूटिल कार्यों को आयात करते हैं)। मान लीजिए कि a_function.py में "mymodule.utils आयात b_function" शामिल है।

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

a_function मॉड्यूल पहले utils.py द्वारा आयात किया जाता है, utils.b_function एक मॉड्यूल नहीं एक समारोह है: यहाँ अतिरिक्त टिप्पणियों के एक समूह के साथ अपने utils.py है। कोई भी मॉड्यूल जो "अंतिम मॉड्यूल से पहले mymodule.utils आयात b_function" से कहता है, b_function फ़ंक्शन के बजाय b_function मॉड्यूल के संदर्भ के साथ समाप्त हो जाएगा।

सामान्यतः, मुझे लगता है कि from somemodule import something मुहावरे किसी भी बड़ी परियोजना के लिए खतरे से भरा हुआ है। यह छोटी स्क्रिप्ट के लिए बहुत अच्छा है, लेकिन एक बार जब आप परिपत्र आयात निर्भरताओं को शुरू करना शुरू करते हैं तो आप समस्याओं में भाग लेते हैं और आपको इसका उपयोग करने के बारे में सावधान रहने की आवश्यकता होती है।

सुरक्षा और टाइपिंग पर बचत के बीच एक समझौता के रूप में, मैं from mymodule import utils का उपयोग करता हूं, फिर utils.a_function() पर कॉल करें। इस तरह, आप ऑब्जेक्ट के दौरान utils.a_function पर बाध्य होने के बावजूद पर ऑब्जेक्ट को हमेशा पर बाध्य करेंगे।

+0

तो 'mymodule के रूप में mymodule.utils आयात करें' और 'mymodule आयात utils' के बीच क्या अंतर है? –

+0

@ माइक डीसिमोन: अच्छा बिंदु। मैंने तदनुसार अपना जवाब अपडेट किया। –

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