sys.modules
शब्दकोश में मॉड्यूल नाम के लिए परीक्षण :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
डोक्यूमेंटेशन से:
यह एक ऐसा शब्दकोश है जो मॉड्यूल नामों को उन मॉड्यूलों में मैप करता है जो पहले ही लोड किए जा चुके हैं।
ध्यान दें कि एक import
कथन दो काम करता है:
- यदि मॉड्यूल को पहले कभी आयात नहीं किया गया है (== मौजूद नहीं है
sys.modules
), तो इसे लोड किया गया है और इसमें जोड़ा गया है sys.modules
।
- वर्तमान नेमस्पेस में 1 या अधिक नामों को बांधें जो मॉड्यूल ऑब्जेक्ट या उन ऑब्जेक्ट्स का संदर्भ देते हैं जो मॉड्यूल नेमस्पेस के सदस्य हैं।
modulename not in sys.modules
यदि चरण 1 पर अभिव्यक्ति अभिव्यक्ति हुई है। चरण 2 के परिणाम के परीक्षण के लिए यह जानना आवश्यक है कि import
विभिन्न वस्तुओं को संदर्भित करने के लिए विभिन्न नामों को निर्धारित करने के लिए क्या सटीक कथन का उपयोग किया गया था:
import modulename
सेट modulename = sys.modules['modulename']
import packagename.nestedmodule
सेट packagename = sys.modules['packagename']
(कोई भी अतिरिक्त स्तर जो आप जोड़ते हैं)
import modulename as altname
सेट altname = sys.module['modulename']
import packagename.nestedmodule as altname
सेट altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
सेट objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
सेट nestedmodulename = sys.modules['packagename.nestedmodulename']
(केवल जब इस आयात से पहले नाम स्थान nestedmodulename
में कोई ऑब्जेक्ट नाम नहीं था packagename
, नेस्टेड मॉड्यूल के लिए एक अतिरिक्त नाम इस बिंदु पर मूल पैकेज नामस्थान में जोड़ा गया है)
from somemodule import objectname as altname
सेट altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
सेट altname = sys.modules['packagename.nestedmodulename']
(केवल जब इस आयात से पहले नाम स्थान nestedmodulename
में कोई ऑब्जेक्ट नाम नहीं था packagename
, नेस्टेड मॉड्यूल के लिए एक अतिरिक्त नाम इस बिंदु पर मूल पैकेज नामस्थान में जोड़ा गया है)
आप परीक्षण कर सकते हैं कि जिस नाम से आयातित वस्तु बंधी थी, वह किसी दिए गए नामस्थान में मौजूद है:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
यह केवल आपको बताता है कि नाम मौजूद है (बाध्य किया गया है), न कि यदि यह उस मॉड्यूल से किसी विशिष्ट मॉड्यूल या ऑब्जेक्ट को संदर्भित करता है। आप उस वस्तु या परीक्षण को आगे बढ़ा सकते हैं यदि यह वही वस्तु है जो इसमें उपलब्ध है sys.modules
, यदि आपको यह बताने की आवश्यकता है कि नाम तब से पूरी तरह से किसी और चीज़ पर सेट किया गया है।
raise SystemError()
मॉड्यूल को आप आयात नहीं करना चाहते, उसके शीर्ष पर बस (या अपनी पसंद का अन्य अपवाद) रखें। यदि आप करते हैं वास्तव में यह कहीं आयात करते हैं, अपने कार्यक्रम ट्रैसबैक और बाहर निकलने फेंक देते हैं।