2012-09-19 16 views
8

मेरे आवेदन में मैं example पैकेज examplemod नामक मॉड्यूल का उपयोग कर रहा हूं।आयातित पायथन मॉड्यूल में निरंतर ओवरराइड कैसे कर सकता हूं?

मेरा ऐप:

from example import examplemod 
examplemod.do_stuff() 

यह बहुत तरह example भीतर एक और मॉड्यूल आयात करता है।

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config एक निरंतर उपयोग करता है।

config.py:

CONSTANT = "Unfortunate value" 

मैं जब मैं अपने आवेदन में examplemod उपयोग कर रहा हूँ (CONSTANT = "Better value" के लिए यह करना) इस निरंतर ओवरराइड करना चाहते हैं और मैं अंतर्निहित संशोधित करने के लिए नहीं करना चाहते हैं मॉड्यूल इसलिए मुझे अपना खुद का पैकेज बनाए रखना नहीं है। मैं यह कैसे कर सकता हूँ?

+0

मैं गलत हो सकता था लेकिन मुझे लगता है कि आप आयात किए जाने के बाद ही चर को एक मान असाइन कर सकते हैं। – Borgleader

उत्तर

3

अपने जवाब के लिए आप सभी को धन्यवाद। उन्होंने मुझे सही दिशा में इंगित किया, हालांकि उनमें से कोई भी लिखित रूप में काम नहीं करता था। मैं कर रहा समाप्त हो गया है:

import example.config 
example.config.CONSTANT = "Better value" 

from example import examplemod 
examplemod.do_stuff() 
# desired result! 

(इसके अलावा, मैं एक पैच मॉड्यूल मेंटेनर को प्रस्तुत कर रहा हूँ लगातार एक विन्यास विकल्प बनाने के लिए तो मैं यह करने के लिए नहीं है, लेकिन शेयर मॉड्यूल स्थापित करने की आवश्यकता औसत समय में।)

1

मुझे यकीन है कि अगर यह पर्याप्त है या नहीं नहीं कर रहा हूँ, लेकिन आप कोशिश किया:

from example import config 
config.CONSTANT = "A desirable value" 

से पहले examplemod आयात किया जाता है ऐसा करने के लिए सुनिश्चित करें। यह काम करना चाहिए क्योंकि पाइथन कैश आयात करता है ताकि config जो आपने संशोधित किया हो वह वही होगा जो examplemod हो जाता है।

1

यह monkey patching कहा जाता है, और यह काफी आम है, यद्यपि वहाँ एक और तरीका है एक ही बात को पूरा करने को प्राथमिकता दी है कि अगर नहीं है:

examplemod.config.CONSTANT = "Better value" 

मुद्दा है कि आप examplemod के आंतरिक भागों में निर्भर हैं, और config शेष वही, यदि मॉड्यूल बदलता है तो यह तोड़ सकता है।

12

हाँ, लेकिन यह केवल मॉड्यूल के लिए पूरी तरह से योग्य पहुँच पथ के साथ अपेक्षा के अनुरूप काम करेंगे:

import example 
example.examplemod.config.CONSTANT = "Better value" 
example.examplemod.do_stuff() 
+0

यह भी उल्लेखनीय है कि अगर examplemod मॉड्यूल ने कॉन्स्टेंट को 'कॉन्फ़िगर आयात कॉन्स्टैंट' सिंटैक्स से सीधे अपने प्रतीक तालिका में आयात किया है, तो आपको example.examplemod.CONSTANT = "बेहतर मान" 'करने की आवश्यकता होगी, उदाहरण के बाद उदाहरण के बाद कॉन्स्टेंट के लिए इसका अपना संदर्भ। जिस फ़ॉर्म का आप उपयोग कर रहे हैं वह config.CONSTANT को प्रतिस्थापित करता है, जो इस मामले में काम करता है कि examplemod मॉड्यूल 'examplemod आयात कॉन्फ़िगरेशन से' का उपयोग कर रहा है; config.CONSTANT'। – Symmetric

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