2009-01-30 4 views
11

में वैश्विक चर के बारे में भ्रम मैं पाइथन के लिए नया हूं, तो कृपया क्षमा करें कि शायद एक सुंदर गूंगा सवाल क्या है।पाइथन

असल में, मेरे पास एक वैश्विक वैरिएबल वैरिएबल है, जिसे _debug कहा जाता है, जिसका उपयोग यह निर्धारित करने के लिए किया जाता है कि स्क्रिप्ट को डीबगिंग जानकारी आउटपुट करना चाहिए या नहीं। मेरी समस्या यह है कि, मैं इसे इस्तेमाल करने वाले की तुलना में इसे एक अलग पायथन लिपि में सेट नहीं कर सकता।

मैं दो स्क्रिप्ट है

one.py: 
------- 

def my_function(): 
    if _debug: 
    print "debugging!" 


two.py: 
------- 

from one import * 
_debug = False 

my_function() 

रनिंग two.py एक त्रुटि उत्पन्न करता है:

NameError: global name '_debug' is not defined 

किसी को भी मुझे बता सकते हैं मैं गलत क्या कर रहा हूँ?

उत्तर

16

केवल डरते हुए अग्रणी अंडरस्कोर की तुलना में अधिक समस्याएं हैं I

जब आप my_function() पर कॉल करते हैं, तब भी आपके debug वैरिएबल में इसके नामस्थान में चर नहीं होगा, जब तक कि आप इसे two.py से आयात न करें।

बेशक, ऐसा करने का मतलब है कि आप चक्रीय निर्भरता (one.py -> two.py -> one.py) के साथ समाप्त हो जाएंगे, और आपको NameError एस मिलेगा जब तक आप रिफैक्टर नहीं करते हैं जहां विभिन्न चीजें आयात और घोषित की जाती हैं। मैं सिर्फ logging में बनाया का उपयोग कर की सिफारिश करेंगे

constants.py 
------------ 
debug = True 

one.py 
------ 
from constants import debug 
#... 

two.py 
------ 
from constants import debug 
#... 

हालांकि,:

एक समाधान के लिए एक सरल तीसरा मॉड्यूल जो इस तरह 'स्थिरांक' को परिभाषित करता है, जो सुरक्षित रूप से कहीं से भी आयात किया जा सकता है, जैसे बनाने के लिए किया जाएगा इसके लिए मॉड्यूल - क्यों नहीं? इसे कॉन्फ़िगर करना आसान है, उपयोग करने में आसान, भरोसेमंद, लचीला और एक्स्टेंसिबल।

+0

हां, लॉगिंग मॉड्यूल यहां जाने का तरीका है। –

5

नाम एक अंडरस्कोर के साथ शुरुआत

from one import * 
+1

और ऐसा इसलिए है क्योंकि उनका मतलब है "यह आंतरिक सामान है, इसे छूएं नहीं, या अपने जोखिम पर ऐसा करें"। –

+0

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

+0

वैसे यह पूरी तरह गलत नहीं है; kgiannakakis उन अंडरस्कोर से शुरू होने वाले नामों के बारे में सही है जिन्हें आयात नहीं किया जा रहा है। हालांकि, आप सही हैं कि यह अभी भी नहीं है कि उनका उदाहरण कोड काम क्यों नहीं करता है। आपका जवाब बहुत बेहतर है। –

4

के साथ आयात नहीं कर रहे हैं आप भी डिबगिंग के लिए __debug__ चर का उपयोग कर सकते हैं। यह सही है अगर दुभाषिया -ओ विकल्प के साथ शुरू नहीं किया गया था। जोरदार बयान भी सहायक हो सकता है।

1

थोड़ा और स्पष्टीकरण: फ़ंक्शन my_function का नामस्थान हमेशा मॉड्यूल one में है। इसका अर्थ यह है कि जब _debug नाम my_function में नहीं मिलता है, तो यह one में दिखता है, न कि नामस्थान जिसे फ़ंक्शन कहा जाता है। अलबास्टर का जवाब एक अच्छा समाधान प्रदान करता है।