2009-12-24 12 views
17

मानक "प्रवेश" मॉड्यूल का आयात डमी प्रविष्टियों में से एक समूह के साथ sys.modules को प्रदूषित करता है:sys.modules में डमी मॉड्यूल क्यों हैं?

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32 
>>> import sys 
>>> import logging 
>>> sorted(x for x in sys.modules.keys() if 'log' in x) 
['logging', 'logging.atexit', 'logging.cStringIO', 'logging.codecs', 
'logging.os', 'logging.string', 'logging.sys', 'logging.thread', 
'logging.threading', 'logging.time', 'logging.traceback', 'logging.types'] 

# and perhaps even more surprising: 
>>> import traceback 
>>> traceback is sys.modules['logging.traceback'] 
False 
>>> sys.modules['logging.traceback'] is None 
True 

तो इस पैकेज का आयात sys.modules में अतिरिक्त नामों डालता है, सिवाय इसके कि वे मॉड्यूल नहीं, बस कोई नहीं के लिए संदर्भ । अन्य मॉड्यूल (उदा। Xml.dom और एन्कोडिंग) में भी यह समस्या है। क्यूं कर?

संपादित करें: bobince के जवाब पर बिल्डिंग, वहाँ the origin का वर्णन पृष्ठ हैं (देखें अनुभाग "sys.modules में डमी प्रविष्टियां") और सुविधा के future

+0

अच्छा लिंक ... मैंने वास्तव में इसे पहले कहीं भी दस्तावेज नहीं देखा था। जाहिर है, किसी कारण से मैंने स्पष्ट शीर्षक "द नाइट्स हू सई नीओ ... वूम ... पिंग" की खोज नहीं की थी। आह, पायथन ... – bobince

+1

मैं एक सटीक डुप्लिकेट पोस्ट करने जा रहा था - मेरा दूसरा आज: पी –

उत्तर

23

sys.modules में मूल्य रिश्तेदार लुकअप की कैश विफलताओं हैं।

तो तुम पैकेज foo में रहे हैं और आप import sys, अजगर एक foo.sys मॉड्यूल के लिए पहले लग रहा है, और कहा कि अगर विफल रहता है शीर्ष स्तर के sys मॉड्यूल को जाता है जब। foo/sys.py के लिए फाइल सिस्टम को फिर से रिश्तेदार आयात पर जांचने से बचने के लिए, यह sys.modules में None स्टोर करता है ताकि यह चिह्नित किया जा सके कि मॉड्यूल मौजूद नहीं था और बाद में आयात फिर से नहीं दिखना चाहिए, लेकिन सीधे sys लोड पर जाना चाहिए।

यह एक सीपीथन कार्यान्वयन विवरण है जिसे आप उपयोगी रूप से भरोसा नहीं कर सकते हैं, लेकिन अगर आप बुरा जादू आयात/पुनः लोडिंग हैकिंग कर रहे हैं तो आपको यह जानना होगा।

यह सभी पैकेजों के साथ होता है, न केवल logging। उदाहरण के लिए, import xml.dom और मॉड्यूल सूची में xml.dom.xml देखें क्योंकि यह xml.dom के अंदर से xml आयात करने का प्रयास करता है।

चूंकि पाइथन पूर्ण आयात की ओर बढ़ता है, इसलिए यह कुरूपता कम होगी।

+0

धन्यवाद! मैंने पृष्ठभूमि में अपने प्रश्न में लिंक जोड़ा, और संदर्भित किया, http://www.python.org/dev/peps/pep-0328 –

+0

यदि यह "सभी संकुलों के साथ होता है", तो मैंने इसे अपने आप से क्यों नहीं देखा सामान? मैं "mymodule.sys", "mymodule.os" और इतने आगे दर्जनों और दर्जनों ऐसे डमी मॉड्यूल के साथ देखने की उम्मीद करता हूं लेकिन केवल इसे xml.dom, लॉगिंग और एन्कोडिंग जैसे कुछ के साथ देखता हूं (डी। शॉली उल्लेख है)। –

+0

यह मेरे पैकेजों के साथ होता है। लेकिन केवल पैकेज, सरल मॉड्यूल नहीं। – bobince

0

मुझे यकीन नहीं है कि ऐसा क्यों होता है लेकिन encodingsNone पर समान संदर्भ प्रदर्शित करता है।

Python 2.6.2 (r262:71600, May 24 2009, 00:12:54) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> for n in filter(lambda x: x.startswith('encodings'), sys.modules): 
... print n, type(sys.modules[n]) 
... 
encodings <type 'module'> 
encodings.encodings <type 'NoneType'> 
encodings.codecs <type 'NoneType'> 
encodings.__builtin__ <type 'NoneType'> 
encodings.utf_8 <type 'module'> 
encodings.aliases <type 'module'> 

मैं वास्तव में नहीं पता है कि कुछ एंट्री जा रहा है None साथ चल रहा है, लेकिन मैं कह सकता हूँ कि यह logging मॉड्यूल के लिए अद्वितीय नहीं है।

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