2009-11-04 7 views
111

मैं उस मॉड्यूल के भीतर से मॉड्यूल का संदर्भ कैसे प्राप्त कर सकता हूं? साथ ही, मैं उस मॉड्यूल वाले पैकेज के संदर्भ कैसे प्राप्त कर सकता हूं?पायथन: मॉड्यूल के अंदर एक मॉड्यूल का संदर्भ कैसे प्राप्त करूं?

+5

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

+1

@ केविन जे। राइस "द बेवकूफ" जो आपके बाद आपके कोड को उठाता है (यानी, आप, 6 महीने बाद) "मेरा दिन बना दिया! – arctelix

+4

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

उत्तर

165
import sys 
current_module = sys.modules[__name__] 
+3

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

+10

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

14

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

+4

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

+0

धन्यवाद, इसे ठीक किया गया। – Michael

8

आप वर्तमान मॉड्यूल __name__

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

current_module = __import__(__name__) 

बारे में पता नहीं आयात है बनें: - अपने स्वाद पर निर्भर करता है - सरल

अजगर documentation

+3

मैं दस्तावेज़ लिंक की सराहना करता हूं। –

3

एक और तकनीक है, जो sys मॉड्यूल आयात नहीं करता है, और यकीनन देखें। पाइथन केवल एक बार प्रत्येक मॉड्यूल आयात करता है।

+0

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

+0

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

1

आप बाहर से उस में पारित कर सकते हैं:

mymod.init(mymod) 

आदर्श नहीं है, लेकिन यह मेरे वर्तमान यूज-केस के लिए काम करता है।

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