मॉड्यूल के अंदर मॉड्यूल का संदर्भ कैसे प्राप्त करें?


158

मैं उस मॉड्यूल के भीतर से किसी मॉड्यूल का संदर्भ कैसे प्राप्त कर सकता हूं? इसके अलावा, मुझे उस मॉड्यूल वाले पैकेज का संदर्भ कैसे मिल सकता है?


7
मुझे संदेह है कि आप इस प्रश्न को पूछ रहे होंगे क्योंकि आपके पास मॉड्यूल स्कोप (जैसे, किसी फ़ंक्शन या क्लास के बाहर BLAH = 10) में एक चर है , फिर एक वर्ग / फ़ंक्शन वैरिएबल जिसे BLAH कहा जाता है, और आप अंतर करना चाहते हैं। एक वैध प्रश्न यहाँ है: क्या यह आवश्यक है? स्कोप के नियम गलती से ख़राब हो जाते हैं, ख़ासकर 'बेवकूफ' जो आपके बाद आपके कोड को उठाता है (यानी, आप 6 महीने बाद)। इस तरह की तरकीबें शायद ही कभी जरूरी हों; मैं उनसे पूरी तरह से बचने का प्रयास करता हूं क्योंकि वे अक्सर भ्रमित होते हैं और बाद में गलत तरीके से संशोधित होते हैं।
केविन जे। चावल

2
@ केविनजे.राइस "द इडियट 'जो आपके (यानी, आप, 6 महीने बाद) अपना कोड चुनता है," मेरा दिन बना दिया!
आर्केलिक्स

8
कौन परवाह करता है कि वह सवाल क्यों पूछ रहा है? ऐसा करने के लिए बहुत सारे वैध कारण हैं।
क्रिस्टोफर नाई

जरूरत है बंद करने की। बहुत उपयोगी है।
एमएलवल्जर

जवाबों:


211
import sys
current_module = sys.modules[__name__]

3
इसके अलावा यदि मॉड्यूल पुनः लोड किया जाता है तो यह काफी सही नहीं होगा; मुझे नहीं लगता कि ऐसा कोई स्थान है जहाँ एक संदर्भ को रखने की गारंटी दी जाती है, अगर वहाँ था, तो फिर से लोड करना वास्तव में सही नहीं होगा?
दिमा तिस्नेक

14
पुनः लोड करना एक ही मॉड्यूल ऑब्जेक्ट का पुन: उपयोग करता है; कोई नया मॉड्यूल ऑब्जेक्ट नहीं बनाया गया है, इसलिए यह फिर से लोडिंग के चेहरे में सही है।
bukzor

18

एक और तकनीक, जो sys मॉड्यूल आयात नहीं करती है, और यकीनन - आपके स्वाद पर निर्भर करती है - सरल:

current_module = __import__(__name__)

पता है कि कोई आयात नहीं है। पायथन प्रत्येक मॉड्यूल को केवल एक बार आयात करता है।


ऐसा लगता है कि आयात करने से बचने के लिए एक बहुत अच्छा तरीका है। पढ़ने के लिए थोड़ा प्रति-सहज होने के अलावा क्या इस दृष्टिकोण के लिए कोई संभावित गिरावट है?
जेरेमीडॉक्सेल

@JeremyDouglass। यह नही है कि मैं जानता हूँ। आयात एक कानूनी, प्रलेखित, बिल्ट-इन फ़ंक्शन (केवल xx फ़ंक्शन) है। आप इसे 'importlib' पैकेज से बदल सकते हैं (आपको इसे आयात करना होगा)। शायद - मेरे साथ कभी नहीं हुआ - आप रिश्तेदार / पूर्ण आयात के साथ एक मुद्दा हो सकता है, अगर एक ही नाम वाला एक मॉड्यूल sys.path में उपलब्ध है, तो इस स्थिति में आप इसे फ़ंक्शन के 'स्तर' तर्क के साथ हल कर सकते हैं।
उरई

16

यदि आपके पास उस मॉड्यूल में एक वर्ग है, तो __module__वर्ग की संपत्ति वर्ग का मॉड्यूल नाम है। इस प्रकार आप मॉड्यूल को एक्सेस कर सकते हैं sys.modules[klass.__module__]। यह कार्यों के लिए भी काम करता है।


4
वास्तव में, ऐसा लगता है कि (कम से कम) एक फ़ंक्शन के लिए, __module__संपत्ति एक मॉड्यूल नहीं है, लेकिन एक स्ट्रिंग है; इस प्रकार inspect.getabsfile(func.__module__)" TypeError: 'os' एक मॉड्यूल, क्लास, मेथड, फंक्शन, ट्रेसबैक, फ्रेम, या ऑब्जेक्ट ऑब्जेक्ट " के साथ फेल नहीं होता है ; जबकि inspect.getabsfile(sys.modules[o.__module__])पास लगता है।
सादाऊ

12

आप वर्तमान मॉड्यूल का उपयोग करके नाम प्राप्त कर सकते हैं __name__

मॉड्यूल संदर्भ sys.modulesशब्दकोश में पाया जा सकता है ।

अजगर प्रलेखन देखें


1

आप इसे बाहर से पास कर सकते हैं:

mymod.init(mymod)

आदर्श नहीं है, लेकिन यह मेरे वर्तमान उपयोग-मामले के लिए काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.