2011-09-21 9 views
5

सबसे पहले, क्षमा करें यदि यह प्रश्न पहले से ही कहीं और पूछा जा रहा है। मैंने वास्तव में इसकी खोज की, लेकिन कुछ भी नहीं मिला। एक फ़ोल्डर mod में, मैं फ़ाइलों __init__.py और sub.py है:उप मॉड्यूल प्राथमिक मॉड्यूल आयात करना

स्थिति निम्नलिखित है। जब कर import mod.sub, क्यों mod/__init__.py फिर से क्रियान्वित किया जाता है

>>> import mod 
mod 
>>> import mod.sub 
mod 
sub 

लेकिन: __init__.py:

print "mod" 

sub.py:

import __init__ 
print "sub" 

अब चलो करते हैं निम्नलिखित वे निम्नलिखित डेटा होते हैं? यह पहले ही आयात किया गया था। ही अजीब सुविधा मौजूद है अगर हम सिर्फ फोन:

>>> import mod.sub 
mod 
mod 
sub 

मैं import __init__ बदलकर व्यवहार बदल सकते हैं? यह वह रेखा है जो मेरे लिए सबसे अधिक गलत लगती है।

+0

आप क्यों कहते हैं "आयात __init__" sub.py ?? – rocksportrocker

+0

क्योंकि प्राथमिक मॉड्यूल 'mod' में साझा कक्षाएं हैं जो उप-वर्ग में उप-वर्गीकृत हैं। – Turion

उत्तर

1

आप द्वारा

import mod 
+0

मुझे यह काउंटर-अंतर्ज्ञानी लगता है कि यह काम करता है। आखिरकार, हम पहले से ही 'mod' फ़ोल्डर में हैं और मैंने सोचा होगा कि दुभाषिया फ़ाइल' mod.py' की तलाश करेगा। – Turion

7

import __init__ 

की जगह आप वास्तव में निरीक्षण कर सकते हैं क्या शब्दकोश sys.modules का उपयोग करके चल रहा है चाहिए। पायथन उस शब्दकोश में कुंजी के आधार पर एक मॉड्यूल को फिर से लोड करने का निर्णय लेता है।

जब आप import mod चलाते हैं, तो यह sys.modules में एक प्रविष्टि, mod बनाता है।

जब आप import mod.sub चलाने के लिए, import __init__ करने के लिए कॉल के बाद, अजगर जांच करता है कि कुंजी mod.__init__sys.modules में है, लेकिन ऐसी कोई कुंजी है, इसलिए इसे फिर से आयात किया जाता है।

नीचे की रेखा यह है कि पायथन sys.modules में मौजूद कुंजी द्वारा मॉड्यूल को दोबारा आयात करने का निर्णय लेता है, क्योंकि वास्तविक मॉड्यूल पहले ही आयात नहीं किया गया था।

+0

अच्छा स्पष्टीकरण, धन्यवाद। – Turion

0

पूर्णता के लिए, मैं एक और समाधान रिश्तेदार आयात के साथ प्रयोग करना पाया:

import __init__ 

बदलें द्वारा

from . import __init__ 

लेकिन मुझे समझ नहीं आता क्यों यह काम करता है।

संपादित करें: यह वास्तव में काम नहीं करता है। परिणामी __init__ मॉड्यूल mod नहीं है, लेकिन method-wrapper प्रकार का कुछ और है। अब मैं पूरी तरह उलझन में हूँ।