2008-09-28 16 views
60

मैं अजगर वैश्विक बयान ("Python scope") के बारे में एक सवाल पढ़ रहा था और जब मैं एक अजगर शुरुआत था मैं के बारे में कितनी बार मैं इस बयान का इस्तेमाल किया याद कर रहा था और कैसे, आजकल, साल बाद (मैं वैश्विक एक बहुत प्रयोग किया जाता) , मैं इसे बिल्कुल भी उपयोग नहीं करता हूं। मैं इसे थोड़ा "अन-पायथनिक" भी मानता हूं।
क्या आप पाइथन में "वैश्विक" कथन का उपयोग करते हैं?

क्या आप इस कथन का उपयोग पायथन में करते हैं? क्या इसका उपयोग समय के साथ बदल गया है?

उत्तर

15

मैंने पाइथन के पेशेवर उपयोग के 3+ वर्षों में किसी भी उत्पादन कोड में और पाइथन शौकिया के रूप में पांच वर्षों में किसी भी उत्पादन कोड में कथन के लिए कभी भी कानूनी उपयोग नहीं किया है। किसी भी राज्य को मुझे कक्षाओं में रहने की जरूरत है या यदि कुछ "वैश्विक" राज्य है, तो यह वैश्विक साझा कैश की तरह कुछ साझा संरचना में बैठता है।

1

एक बार या दो बार। लेकिन यह हमेशा रिएक्टर के लिए अच्छा प्रारंभ बिंदु था।

0

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

3

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

8

मेरे विचार में, जैसे ही आपको पाइथन में वैश्विक चर का उपयोग करने की आवश्यकता महसूस होती है कोड, यह थोड़ा सा रोकने के लिए एक अच्छा समय है और आपके कोड के रिफैक्टरिंग पर काम करता है।
कोड में global डालकर और रीफैक्टरिंग प्रक्रिया में देरी हो सकती है अगर आपकी मृत रेखा करीब है, लेकिन मेरा विश्वास करो, आप इस पर वापस नहीं जायेंगे और जब तक आपको वास्तव में नहीं करना चाहिए - जैसे आपका कोड बंद हो गया है कुछ अजीब कारणों से काम करने के लिए, आपको इसे डीबग करना होगा, आप उनमें से कुछ global चर का सामना करते हैं और वे सब कुछ गड़बड़ कर रहे हैं।

तो, ईमानदारी से, यहां तक ​​कि इसकी अनुमति है, जितना मैं इसे उपयोग करने से बच सकता हूं। भले ही इसका मतलब कोड के आपके टुकड़े के चारों ओर एक साधारण वर्ग-निर्माण हो।

2

मैं इससे बचता हूं और हमारे पास pylint नियम भी है जो इसे हमारे उत्पादन कोड में प्रतिबंधित करता है। मुझे वास्तव में विश्वास है कि यह भी अस्तित्व में नहीं होना चाहिए।

54

मैं इस जैसे एक संदर्भ में 'वैश्विक' का उपयोग करें:

_cached_result = None 
def myComputationallyExpensiveFunction(): 
    global _cached_result 
    if _cached_result: 
     return _cached_result 

    # ... figure out result 

    _cached_result = result 
    return result 

मैं 'वैश्विक' उपयोग करें, क्योंकि यह समझ में आता है और समारोह क्या हो रहा है के पाठक के लिए स्पष्ट है। मुझे यह भी पता इस पद्धति है, जो बराबर है वहाँ है, लेकिन पाठक के बारे में अधिक संज्ञानात्मक लोड देता है:

def myComputationallyExpensiveFunction(): 
    if myComputationallyExpensiveFunction.cache: 
     return myComputationallyExpensiveFunction.cache 

    # ... figure out result 

    myComputationallyExpensiveFunction.cache = result 
    return result 
myComputationallyExpensiveFunction.cache = None 
+15

मैं इस तरह के मामलों में डेकोरेटर मॉड्यूल की 'memoize' समारोह का उपयोग करते हैं, लेकिन मैं अपने वैश्विक उपयोग के स्पष्टता गलती नहीं कर सकते हैं :) –

+6

: कुछ उदाहरण हैं एक समारोह की विशेषता को परिभाषित करने की संभावना के बारे में नहीं पता था जैसे myComputationallyExpensiveFunction.cache और फ़ंक्शन बॉडी के अंदर इसका उपयोग करके, धन्यवाद! –

+2

मैंने कभी किसी फ़ंक्शन में एक विशेषता निर्दिष्ट करने के बारे में नहीं सुना था, यह बहुत अच्छी चीजें है! धन्यवाद! – brad

2

शायद ही कभी। मुझे अभी तक इसका उपयोग नहीं मिला है।

2

यह राज्य साझा करने के लिए धागे में उपयोगी हो सकता है (इसके चारों ओर लॉकिंग तंत्र के साथ)।

हालांकि, मैं शायद ही कभी इसका उपयोग करता हूं।

2

मैंने इसे त्वरित रूप से & गंदे, एकल-उपयोग स्क्रिप्ट में कुछ एक बार कार्य स्वचालित करने के लिए उपयोग किया है। इससे भी बड़ा कुछ भी, या इसे पुन: उपयोग करने की आवश्यकता है, और मुझे एक और अधिक शानदार तरीका मिल जाएगा।

3

मैं कमांड लाइन स्क्रिप्ट और 'optparse' के साथ वैश्विक विकल्प के लिए इसका इस्तेमाल करते हैं:

अपने मुख्य() तर्क पार्स करता है और जो कुछ भी समारोह स्क्रिप्ट का काम करता है के लिए उन गुजरता है ... लेकिन आपूर्ति लिखते हैं वैश्विक 'ऑप्ट्स' शब्दकोश के विकल्प।

शैल स्क्रिप्ट विकल्प अक्सर 'पत्ते' व्यवहार को ट्विक करते हैं, और यह प्रत्येक तर्क सूची के माध्यम से 'opts' शब्दकोश को थ्रेड करने के लिए असुविधाजनक (और अनावश्यक) है।

9

मैंने इसे ऐसी परिस्थितियों में उपयोग किया है जहां कोई फ़ंक्शन बनाता है या चर सेट करता है जिसका उपयोग वैश्विक स्तर पर किया जाएगा। मैं

discretes = 0 
def use_discretes(): 
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes" 
    global discretes 
    if using_real_hardware(): 
     discretes = 1 
... 

या

file1.py: 
    def setup(): 
     global DISP1, DISP2, DISP3 
     DISP1 = grab_handle('display_1') 
     DISP2 = grab_handle('display_2') 
     DISP3 = grab_handle('display_3') 
     ... 

file2.py: 
    import file1 

    file1.setup() 
    #file1.DISP1 DOES NOT EXIST until after setup() is called. 
    file1.DISP1.resolution = 1024, 768 
संबंधित मुद्दे