पायथन लिपि के बीच में मैं सभी चर कैसे साफ करूं?


86

मैं मतलाब में 'स्पष्ट' के समान कुछ खोज रहा हूं: एक कमांड / फ़ंक्शन जो कार्यक्षेत्र से सभी चर हटाता है, उन्हें सिस्टम मेमोरी से जारी करता है। क्या पायथन में ऐसा कुछ है?

संपादित करें: मैं एक स्क्रिप्ट लिखना चाहता हूं जो कुछ बिंदु पर सभी चर को साफ करती है।


2
यह उपयोगी होगा यदि आपने अपना शीर्षक कुछ इस तरह बदल दिया "मैं पायथन स्क्रिप्ट के बीच में सभी चर कैसे साफ करूं?" विषय पर भविष्य की खोज के लिए, क्योंकि "पायथन में कमांड विंडो को कैसे पुनरारंभ करें?" वास्तव में आप जो पूछ रहे हैं उससे कोई लेना-देना नहीं है।
— सैम डोलन

क्या आप कोई संभावित संदर्भ प्रदान कर सकते हैं जिसमें यह समझ में आता है?
— S.Lott

2
लगता है कि कोडिंग की आदतों को अपने मूल वातावरण से एक में ले जाने की कोशिश करने का एक और मामला जहां उन्हें कोई मतलब नहीं है।
— ग्लेन मेनार्ड

यदि आप बस कुछ विशाल वस्तुओं (छवियों या अन्य विशाल सरणियों) के बारे में चिंतित हैं, तो आप delउन्हें कर सकते हैं जब आप कर रहे हों। यदि आप केवल नाम स्थान के अव्यवस्थित होने के बारे में चिंतित हैं, तो आपको संभवतः कई नामों का उपयोग करके अपने डिजाइन पर पुनर्विचार करना चाहिए। उदाहरण के लिए, छवि परिवर्तन की एक श्रृंखला के लिए, हर अंतरिम कदम को रखने की संभावना अनावश्यक है।
— निक टी

3
@ एस.लॉट: कंसोल में खोजपूर्ण वैज्ञानिक विश्लेषण। कई अन-वॉन्टेड वैरिएबल (चीजों को आजमाने के बाद, और फिर यह तय करना कि यह एक प्रासंगिक मार्ग नहीं है) के साथ समाप्त होना आम है। लेकिन इस मामले में, जॉन ला रोय का जवाब सबसे उपयुक्त है।
— n

जवाबों:


69

आदेशों का निम्नलिखित क्रम वर्तमान मॉड्यूल से प्रत्येक नाम को हटा देता है :

>>> import sys
>>> sys.modules[__name__].__dict__.clear()

मुझे संदेह है कि आप वास्तव में ऐसा करना चाहते हैं, क्योंकि "हर नाम" में सभी बिल्ट-इन शामिल हैं, इसलिए इस तरह के कुल वाइप-आउट के बाद आप बहुत कुछ नहीं कर सकते हैं। याद रखें, पायथन में एक "चर" के रूप में वास्तव में ऐसी कोई बात नहीं है - देखते हैं वस्तुओं , कई प्रकार के (मॉड्यूल, काम करता है, वर्ग, संख्या, तार, ... सहित), और देखते हैं नाम , वस्तुओं के लिए बाध्य; अनुक्रम क्या करता है प्रत्येक नाम को एक मॉड्यूल से हटा दिया जाता है (यदि संबंधित वस्तुएं चली जाती हैं, तो केवल और अगर उनके लिए हर संदर्भ को हटा दिया गया है)।

हो सकता है कि आप अधिक चयनात्मक होना चाहते हैं, लेकिन यह अनुमान लगाना कठिन है कि जब तक आप अधिक विशिष्ट होना चाहते हैं, तब तक आपका क्या मतलब है। लेकिन, सिर्फ एक उदाहरण देने के लिए:

>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
...   if n[0]!='_': delattr(this, n)
... 
>>>

यह अनुक्रम अकेले उन नामों को छोड़ देता है जो निजी या जादुई होते हैं, जिसमें __builtins__विशेष नाम शामिल होता है जिसमें सभी निर्मित नाम होते हैं। इसलिए, बिल्ट-इन अभी भी काम करते हैं - उदाहरण के लिए:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 

जैसा कि आप देखते हैं, नाम n(उस में नियंत्रण चर for) भी चारों ओर चिपकाने के लिए होता है (जैसा कि इसके forमाध्यम से हर बार खंड में फिर से बँधा होता है), इसलिए यह बेहतर होगा कि उस नियंत्रण चर को नाम दें _, उदाहरण के लिए, स्पष्ट रूप से दिखाने के लिए " विशेष "(साथ ही, इंटरएक्टिव इंटरप्रेटर में, नाम _वैसे भी हर अभिव्यक्ति के तुरंत बाद फिर से बंध जाता है, उस अभिव्यक्ति के मूल्य पर, इसलिए यह लंबे समय तक नहीं टिकेगा ;-)

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


2
वैसे आप हमेशा स्टार्टअप पर मूल शब्दकोश की एक प्रति रख सकते हैं और फिर जोड़े गए नामों को हटा सकते हैं;) हालांकि मुझे लगता है कि यह गतिशील प्रणाली का स्पष्ट दुरुपयोग है, और मैं ऐसा करने के लिए एक गैर-बेकार स्थिति के बारे में नहीं सोच सकता। में,
— monoceres

5
Haha, यह शानदार है ... यह आश्चर्य की बात ऐसा करने से आप कितना कार्यक्षमता खो है, और अभी तक कितना कार्यक्षमता आप की तरह सामान करके वापस प्राप्त कर सकते int = (2).__class__, str = ''.__class__, True = (1 == 1)आदि ...
— चिन्मय कांची

@monoceres, आप उस कॉपी का नाम कैसे देंगे और आप इसे कहां छिपाएंगे ताकि यह दूर भी न मिटे? -)
— एलेक्स मार्टेली

2
जितना अधिक मैं पायथन का उपयोग करता हूं, उतना ही मैं इसे प्यार करता हूं। न केवल यह एक महान भाषा है, आप इसके साथ केवल घंटों तक का समय बिता सकते हैं और इसे ऐसी चीजें बना सकते हैं जो आप वास्तव में करते हैं
— ।;

1
शायद मैं इसे गलत तरीके से मिला, लेकिन मुझे एक समस्या का सामना करना पड़ा: जब आप for n in dir(): ... if n[0]!='_': delattr(this, n)कुछ पल का उपयोग करते हैं n=thisऔर आप इसे लूप में हटा देते हैं! तो अगले पुनरावृत्ति पर आपको त्रुटि की कोशिश delattr(this,n)हो रही है क्योंकि आपने इसे हटा दिया है! :) तो यह सही ढंग से काम नहीं करता है
— मिखाइल_साम

60

नहीं, आप दुभाषिया को फिर से शुरू करना सबसे अच्छा है

IPython बंडल इंटरप्रेटर के लिए एक उत्कृष्ट प्रतिस्थापन है और इसमें %resetकमांड है जो आमतौर पर काम करता है


1
'नहीं' से आपका मतलब है कि मुझे ऐसा नहीं करना चाहिए या यह असंभव है? यदि आप कहते हैं कि मुझे ऐसा नहीं करना चाहिए तो आप यह बता सकते हैं कि क्यों?
— सुबह

6
+1: यह दुभाषिया में वापस आने के लिए मेरे लिए ctrl-dतब pyt-> के एक चौथाई से भी कम समय लेता है tab। यहां कुछ भी फैंसी करने का कोई कारण नहीं।
— सैम डोलन

3
% रीसेट अधिकांश चर के लिए काम करता है, कुछ के लिए यह नहीं करता है। मेरे लिए, केवल दुभाषिया को फिर से शुरू करने से सब कुछ साफ हो जाता है।
— Artemis_clyde

3
%reset -fगैर-संवादात्मक होने के लिए उपयोग करें । stackoverflow.com/questions/38798181/…
— जोकिम वैगनर

27

यदि आप एक फ़ंक्शन लिखते हैं तो एक बार जब आप इसे छोड़ देते हैं तो सभी नाम गायब हो जाते हैं।

अवधारणा को नामस्थान कहा जाता है और यह बहुत अच्छा है, इसने इसे पायथन के ज़ेन में बनाया :

नाम स्थान एक महान विचार का सम्मान कर रहे हैं - चलो उन में से अधिक करते हैं!

IPython के नामस्थान को इसी तरह मैजिक कमांड के साथ रीसेट किया जा सकता है %reset -f। ( -f"बल" का अर्थ है; दूसरे शब्दों में, "मुझसे यह न पूछें कि क्या मैं वास्तव में सभी चर हटाना चाहता हूं, बस ऐसा करें।)"


मैं स्पष्ट जोड़ूंगा: यदि आप एक मुख्य कार्य के अंदर सब कुछ डालते हैं (आयात सहित) तो आप एक कार्यस्थल पर अभ्यास करते हैं जिसे आप केवल उस फ़ंक्शन से बाहर निकलकर रीसेट कर सकते हैं। मेरा मानना ​​है कि वास्तव में इस सवाल का उद्देश्य क्या था।
— डेविड

8
from IPython import get_ipython;   
get_ipython().magic('reset -sf')


1
या बस%reset -sf
— सत्यमेव जयते

1
वास्तव में,% reset -sf कमांड काम नहीं करता है और एरर फेंकता है, जब आप अपनी पाइथन स्क्रिप्ट को एनाकोंडा प्रॉम्प्ट से चलाते हैं (भले ही जब आपने कोशिश का इस्तेमाल किया हो - सिवाय इसके; यह काम नहीं कर रहा हो)। आप एक ही कोशिश कर सकते हैं और आप देखेंगे। लेकिन, ipython पुस्तकालय का उपयोग इस समस्या को हल करेगा, हर संभव मामले में।
— अनुराग गुप्ता

5

यह एलेक्स के जवाब का एक संशोधित संस्करण है। हम एक मॉड्यूल के नाम स्थान की स्थिति को बचा सकते हैं और निम्नलिखित 2 विधियों का उपयोग करके इसे पुनर्स्थापित कर सकते हैं ...

__saved_context__ = {}

def saveContext():
    import sys
    __saved_context__.update(sys.modules[__name__].__dict__)

def restoreContext():
    import sys
    names = sys.modules[__name__].__dict__.keys()
    for n in names:
        if n not in __saved_context__:
            del sys.modules[__name__].__dict__[n]

saveContext()

hello = 'hi there'
print hello             # prints "hi there" on stdout

restoreContext()

print hello             # throws an exception

आप saveContext () और क्लियर () को कॉल करने से पहले एक लाइन "क्लियर = रिस्टोरकॉन्टेक्ट" भी जोड़ सकते हैं जो मैटलैब के क्लीयर की तरह काम करेगा।


1
बहुत बढ़िया जवाब! मेरा मानना ​​है कि पायथन 3 के साथ आप पुनर्स्थापना करना चाहते हैं। इसके साथ पुन: जुड़ना चाहते हैं names = list(sys.modules[__name__].__dict__.keys()), अन्यथा पायथन शिकायत करेगा कि आपने dict_keysऑब्जेक्ट के माध्यम से पुनरावृति करते हुए शब्दकोश आकार बदल दिया है ।
— सैम बैडर

इसके अलावा, उन लोगों के लिए जो importइस उत्तर को चाहते हैं (जैसे कि मैंने इसे सहेज लिया है और मैं इसे एक होमवर्क असाइनमेंट में विभिन्न समस्याओं के बीच नाम स्थान को खाली करने के लिए ज्यूपिटर नोटबुक से आयात करता हूं), मुझे लगता है कि आप "__main__"इसके बजाय उपयोग करना चाहते हैं __name__।
— सैम बैडर

3

स्पाइडर में प्रत्येक मेनू में प्रत्येक निष्पादन से पहले सभी चर को खाली करने के लिए प्रत्येक पायथन फ़ाइल के लिए IPython कंसोल को कॉन्फ़िगर कर सकता है Run -> Configuration -> General settings -> Remove all variables before execution।


2

globals()समारोह एक शब्दकोश है, जहां कुंजी वस्तुओं आप नाम कर सकते हैं के नाम हैं रिटर्न (और मूल्यों, वैसे, कर रहे हैं idइन वस्तुओं में से रों) exec()समारोह एक स्ट्रिंग और वह निष्पादित के रूप में अगर तुम सिर्फ एक अजगर कंसोल में इसे टाइप लेता है। तो, कोड है

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))

हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित आपकी प्रतिक्रिया की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जान सकते हैं।
— स्टीफन क्रैन

धन्यवाद। क्या यह अब बेहतर है?
— कोलाय।


0

सभी आवश्यक चर को परिभाषित करने वाला एक वर्ग बनाने का सबसे आसान तरीका नहीं है? फिर आपके पास सभी क्यूरेट चर के साथ एक वस्तु है, और यदि आपको आवश्यकता है तो आप इस चर को अधिलेखित कर सकते हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.