Sunday, 15 April 2012

python - imported modules becomes None when replacing current module in sys.modules using a class object -


एक अलोकप्रिय लेकिन "समर्थित" अजगर हैक (देखें गिदो:) जो मॉड्यूल पर __ getattr __ उपयोग को सक्षम करता है गुण निम्नलिखित में शामिल हैं:

  आयात ओएस, sys वर्ग MyClass (ऑब्जेक्ट): def चेक_ऑस (स्वयं): प्रिंट ओएस sys.modules [__ नाम__] = मायक्लस ()  

आयात पर, यह आयातित मॉड्यूल एक क्लास उदाहरण बन जाता है:

  & gt; & gt; & gt; मेरा मॉड्यूल आयात करें & gt; & gt; & gt; MyModule & lt; myModule.MyClass ऑब्जेक्ट 0xf76def2c & gt;  

हालांकि, पायथन -2.7 में, मूल मॉड्यूल के भीतर अन्य सभी आयात किए गए मॉड्यूल को कोई नहीं पर सेट किया गया है।

  & gt; & gt; & gt; Repro.check_os () कोई नहीं  

पायथन-3.4 में, सब कुछ काम करता है:

  & gt; & gt; & gt; Repro.check_os () & lt; मॉड्यूल 'ओएस' से '/python/3.4.1/lib/python3.4/os.py'>  

यह किसी के साथ ऐसा करने जैसा लगता है, लेकिन, किसी को भी यह क्यों आंतरिक रूप से होता है?

ऐसा लगता है कि अगर आप मूल मॉड्यूल को संग्रहीत करते हैं पायथन -2) तब सब कुछ काम करना जारी रहता है:

  sys.modules [__ नाम __ + '_ बाक'] = sys.modules [__ नाम__]  
< P>

आप जिस समस्या में चल रहे हैं वह है कि पाइथन में 3.4 से पहले जब एक मॉड्यूल नष्ट हो जाता है (जैसा कि आपका है क्योंकि आप इसे एक वर्ग के साथ बदलते हैं और इसके बारे में कोई और संदर्भ नहीं है), उस मॉड्यूल की __ निर्देश __ में आइटम को जबरन रूप से None पर सेट कर दिया गया है।

3.4 से पहले पाइथन का समर्थन, उस वर्ग में एक import कथन है जो मॉड्यूल को प्रतिस्थापित करेगा:

  वर्ग MyClass (ऑब्जेक्ट): import os def check_os (self) : प्रिंट (ओएस)  

अधिक जानकारी के लिए, देखें।


No comments:

Post a Comment