2009-09-05 8 views
72

मैं एक स्थिर परिभाषित करना चाहता हूं जो पैकेज के सभी submodules में उपलब्ध होना चाहिए। मैंने सोचा है कि रूट पैकेज की __init__.py फ़ाइल में सबसे अच्छी जगह होगी। लेकिन मुझे नहीं पता कि यह कैसे करें। मान लीजिए मेरे पास कुछ उप-पैकेज हैं और प्रत्येक में कई मॉड्यूल हैं। मैं इन मॉड्यूल से उस चर को कैसे एक्सेस कर सकता हूं?क्या मैं वैश्विक चर परिभाषित करने के लिए __init__.py का उपयोग कर सकता हूं?

बेशक, यदि यह पूरी तरह से गलत है, और एक बेहतर विकल्प है, तो मैं इसे जानना चाहता हूं।

उत्तर

120

आप उन्हें __init__.py में डालने के लिए सक्षम होना चाहिए: सबसे अच्छा तरीका है इस लक्ष्य को हासिल करने के लिए हर जगह आप इसे की आवश्यकता होती है एक "config" मॉड्यूल में अपने स्थिरांक को परिभाषित करने और आयात करने के लिए है। यह हर समय किया जाता है।

mypackage/__init__.py:

MY_CONSTANT = 42 

mypackage/mymodule.py:

from mypackage import MY_CONSTANT 
print "my constant is", MY_CONSTANT 

फिर, आयात mymodule:

>>> from mypackage import mymodule 
my constant is 42 

फिर भी, अगर आप निरंतर है एस, यह एक अलग मॉड्यूल (constants.py, config.py, ...) में रखने के लिए उचित (सर्वोत्तम प्रथाओं, संभवतः) होगा और फिर यदि आप उन्हें पैकेज नामस्थान में चाहते हैं, तो उन्हें आयात करें।

mypackage/__init__.py:

from mypackage.constants import * 

फिर भी, यह स्वचालित रूप से पैकेज मॉड्यूल की नामस्थान में स्थिरांक शामिल नहीं है। पैकेज में प्रत्येक मॉड्यूल को अभी भी mypackage या mypackage.constants से स्थिर रूप से स्थिरांक आयात करना होगा।

+0

हाँ, यह समझ में आता है कि आपको उन्हें आयात करना है। –

+9

यह स्वीकार्य उत्तर होना चाहिए था। यदि आप पाइथन 2.5 या उच्चतर के साथ काम कर रहे हैं तो आप एक स्पष्ट रिश्तेदार आयात के साथ-साथ वर्णित [यहां] (http://docs.python.org/2/tutorial/modules.html#intra-package-references) का भी उपयोग कर सकते हैं: से आयात करें MY_CONSTANT' – ThatAintWorking

+0

यह उत्तर सही है और कार्यवाही के बजाय प्रत्यक्ष समाधान प्रदान करता है। इसे उपलब्ध कराने के लिए धन्यवाद और यह स्वीकार्य उत्तर होना चाहिए। +1 – Hazok

30

आप ऐसा नहीं कर सकते हैं। आपको प्रत्येक स्थिर मॉड्यूल के नामस्थान में अपने स्थिरांक को स्पष्ट रूप से आयात करना होगा।

# mypackage/config.py 
MY_CONST = 17 

# mypackage/main.py 
from mypackage.config import * 
+0

हाँ, एक विन्यास फाइल क्या है मुझे यकीन है कि अगर वहाँ अजगर 2 और 3 इसलिए यहाँ के बीच कोई अंतर है दोनों के लिंक हैं नहीं कर रहा हूँ मैं पसंद करूँगा। मैंने सोचा कि __init__.py एक अच्छी जगह होगी। आपका समाधान मानक अभ्यास की तरह लगता है। क्या यह? –

+0

अच्छा बिंदु। मुझे एहसास नहीं हुआ कि सभी पैकेज मॉड्यूल के नामस्थान में स्थिरांक _automatically_ रखा गया था। –

+0

लेकिन हर बार एक स्क्रिप्ट config.py आयात करता है, अंदर कोड निष्पादित किया जाता है। Config.py के अंदर कोड केवल एक बार चलाने के लिए यदि आप अनुशंसा करते हैं तो आप क्या सलाह देते हैं? मान लें कि मैं config.py के अंदर एक सेटिंग्स.जेसन फ़ाइल पढ़ रहा हूं और जब भी मैं config.py आयात करता हूं, मैं इसे खोलना नहीं चाहता()। – Augiwan

2

आप कहीं से भी वैश्विक चर परिभाषित कर सकते हैं, लेकिन यह वास्तव में एक बुरा विचार है। __builtin__ मॉड्यूल आयात करें और संशोधित करें या इस मॉड्यूल में विशेषताओं को जोड़ें, और अचानक आपके पास नए अंतर्निहित स्थिरांक या कार्य हैं। असल में, जब मेरा एप्लिकेशन गेटटेक्स्ट इंस्टॉल करता है, तो मुझे कुछ भी आयात किए बिना, मेरे सभी मॉड्यूल में _() फ़ंक्शन मिलता है। तो यह संभव है, लेकिन निश्चित रूप से केवल आवेदन-प्रकार परियोजनाओं के लिए, पुन: प्रयोज्य पैकेज या मॉड्यूल के लिए नहीं।

और मुझे लगता है कि कोई भी इस अभ्यास को वैसे भी अनुशंसा नहीं करेगा। नामस्थान के साथ क्या गलत है? कहा तो यह है कि मैं "वैश्विक" चर version.VERSION की तरह, उपलब्ध आवेदन, संस्करण मॉड्यूल है version.PACKAGE_NAME आदि

1

बस जोड़ने के लिए configparser लाइब्रेरी का उपयोग कर कि स्थिरांक एक config.ini फ़ाइल का उपयोग नियोजित किया जा सकता और पार्स स्क्रिप्ट में चाहते थे । इस तरह आप कई परिस्थितियों के लिए स्थिरांक हो सकता है। उदाहरण के लिए यदि आप दो अलग-अलग यूआरएल अनुरोधों के लिए पैरामीटर स्थिरांक था सिर्फ उन्हें तो जैसे लेबल:

mymodule/config.ini 
[request0] 
conn = '[email protected]' 
pass = 'admin' 
... 

[request1] 
conn = '[email protected]' 
pass = 'dinosaur' 
... 

मैं अजगर वेबसाइट बहुत उपयोगी पर प्रलेखन पाया।

अजगर 3 के लिए:: https://docs.python.org/3/library/configparser.html#module-configparser

अजगर 2 के लिए: https://docs.python.org/2/library/configparser.html#module-configparser

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