আমি পাইথন স্ক্রিপ্টের মাঝখানে সমস্ত ভেরিয়েবল কীভাবে সাফ করব?


88

আমি মতলব-তে 'পরিষ্কার' এর অনুরূপ কিছু সন্ধান করছি: একটি কমান্ড / ফাংশন যা ওয়ার্কস্পেস থেকে সমস্ত ভেরিয়েবলগুলি সরিয়ে দেয়, সিস্টেম মেমোরি থেকে মুক্তি দেয়। পাইথনে এমন কি আছে?

সম্পাদনা: আমি একটি স্ক্রিপ্ট লিখতে চাই যা কিছু সময়ে সমস্ত ভেরিয়েবল সাফ করে দেয়।


4
আপনি যদি আপনার শিরোনামটিকে "পাইথন স্ক্রিপ্টের মাঝখানে সমস্ত ভেরিয়েবলগুলি কীভাবে সাফ করবেন?" ভবিষ্যতে বিষয়গুলির অনুসন্ধানের জন্য, কারণ "পাইথনে কমান্ড উইন্ডোটি পুনরায় আরম্ভ করবেন কীভাবে?" আপনি যা জিজ্ঞাসা করছেন তার সাথে কিছুই করার নেই।
স্যাম ডোলান

আপনি যে কোনও সম্ভাব্য প্রসঙ্গটি সরবরাহ করতে পারেন যা এটি উপলব্ধি করে?
এসলট

4
কোডিং অভ্যাসগুলি তাদের স্থানীয় পরিবেশ থেকে এমন এক স্থানে নিয়ে যাওয়ার চেষ্টা করার মতো অন্য একটি শব্দের মতো মনে হচ্ছে যেখানে তারা কোনও ধারণা দেয় না।
গ্লেন মেইনার্ড

আপনি যদি কিছু বিশাল বস্তু (চিত্র বা অন্যান্য বিশাল অ্যারে) সম্পর্কে কেবল উদ্বিগ্ন হন, কাজ delশেষ হয়ে গেলে আপনি এগুলি করতে পারেন । আপনি যদি নাম স্থানটি বিশৃঙ্খলাবদ্ধ হওয়ার বিষয়ে কেবল চিন্তিত হন তবে আপনার সম্ভবত এতগুলি নাম ব্যবহার করে আপনার নকশাকে পুনর্বিবেচনা করা উচিত। উদাহরণস্বরূপ, একাধিক চিত্রের রূপান্তরকরণের জন্য, প্রতিটি অন্তর্বর্তী পদক্ষেপ রাখা সম্ভবত অপ্রয়োজনীয়।
নিক টি

4
@ এস.লোট: কনসোলে অনুসন্ধানী বৈজ্ঞানিক বিশ্লেষণ। অনেক আন-ওয়ান্টেড ভেরিয়েবল (জিনিস চেষ্টা করার পরে এবং এটি কোনও প্রাসঙ্গিক পথ নয়) সিদ্ধান্ত নিয়ে শেষ হওয়া সাধারণ common তবে এক্ষেত্রে জন লা রয়ের উত্তর সবচেয়ে উপযুক্ত।
nnot101

উত্তর:


70

নিম্নলিখিত কমান্ডের ক্রম বর্তমান মডিউল থেকে প্রতিটি নাম সরিয়ে দেয়:

>>> 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প্রতিবারের সাথে দফায় পুনরায় আবদ্ধ থাকে), সুতরাং সেই নিয়ন্ত্রণের পরিবর্তনশীলটির নাম দেওয়া ভাল _, উদাহরণস্বরূপ, "এটি স্পষ্টভাবে দেখানো" বিশেষ "(প্লাস, ইন্টারেক্টিভ ইন্টারপ্রেটারে, নামটি _যেভাবেই প্রম্পটে প্রবেশ করা সমস্ত সম্পূর্ণ এক্সপ্রেশনের পরে সেই অভিব্যক্তির মান হিসাবে পুনরায় সীমাবদ্ধ হয়, তাই এটি দীর্ঘকাল স্থায়ী হবে না ;-)।

যাই হোক, একবার আপনি ঠিক নির্ধারণ করেছি তা হল আপনি কি করতে চান, তাই না হার্ড উদ্দেশ্যে একটি ফাংশন নির্ধারণ এবং আপনার স্টার্ট আপ ফাইল রাখা (যদি আপনি এটি শুধুমাত্র ইন্টারেক্টিভ সেশনে চান) বা সাইট-কাস্টমাইজ ফাইল (এর আপনি যদি প্রতিটি স্ক্রিপ্টে এটি চান)।


4
আচ্ছা আপনি সর্বদা শুরুতে মূল অভিধানের একটি অনুলিপি রাখতে পারেন এবং তারপরে যুক্ত করা নামগুলি মুছে ফেলতে পারেন;) তবে আমি মনে করি এটি গতিশীল ব্যবস্থার সুস্পষ্ট অপব্যবহার, এবং এটি করার জন্য আমি কোনও অর্থহীন পরিস্থিতির কথা ভাবতে পারি না ইন
মিনিটে মনসরেসেস

4
হা হা, এই উজ্জ্বল ... এতে অবাক হওয়ার কিছু এই করে আপনি কতটা কার্যকারিতা হারাতে, এবং এখনও কত কার্যকারিতা তোমার মত কাপড় করে ফিরে পেতে পারেন int = (2).__class__, str = ''.__class__, True = (1 == 1)ইত্যাদি ...
Chinmay কাঞ্চী

@ মোমোনসেস, আপনি কীভাবে সেই অনুলিপিটির নাম রাখবেন এবং এটি কোথায় মুছে ফেলবেন যাতে এটি মুছে ফেলা হয় না? -)
অ্যালেক্স মার্টেলি

4
আমি পাইথনটি যত বেশি ব্যবহার করি, ততই আমি এটির ভালবাসি। এটি কেবল দুর্দান্ত ভাষাই নয়, আপনি এটির সাথে ঘন ঘন ঘন ব্যয় করতে এবং এটি এমন কিছু করতেও পারেন যা আপনার সত্যই করা উচিত নয় ;-)
চিন্ময় কাঞ্চি

4
হতে পারে আমি এটি ভুল উপায়ে পেয়েছি, তবে আমি একটি সমস্যার মুখোমুখি হয়েছি: আপনি যখন for n in dir(): ... if n[0]!='_': delattr(this, n)কোনও মুহুর্তে ব্যবহার করেন n=thisএবং আপনি এটি লুপে মুছবেন! পরের পুনরাবৃত্তিতে আপনি চেষ্টা করে ত্রুটি পেয়ে যাবেন delattr(this,n)কারণ আপনি কেবল এটি মুছে ফেলেছেন! :) সুতরাং এটি সঠিকভাবে কাজ করে না
মিখাইল_সাম

59

না, আপনি দোভাষী পুনরায় চালু করা ভাল

আইপিথন হ'ল বান্ডিলযুক্ত দোভাষী এর একটি দুর্দান্ত প্রতিস্থাপন এবং %resetকমান্ডটি রয়েছে যা সাধারণত কাজ করে


4
'না' দ্বারা আপনি বোঝাতে চেয়েছিলেন আমার এটি করা উচিত নয় বা এটি অসম্ভব? আপনি যদি বলেন আমার উচিত না তবে আপনি কেন ব্যাখ্যা করতে পারবেন?
স্নিগাইল

6
+1: আমার কাছে ctrl-dতখন pyt-> tabদোভাষীটিতে ফিরে যেতে এক সেকেন্ডের চতুর্থাংশেরও কম সময় লাগে । এখানে অভিনব কিছু করার কোনও কারণ নেই।
স্যাম ডোলান

4
% রিসেট বেশিরভাগ ভেরিয়েবলের জন্য কাজ করে, কারও কারও পক্ষে এটি হয় না। আমার জন্য, দোভাষীকে পুনরায় চালু করা সমস্ত কিছু পরিষ্কার করার গ্যারান্টি দেয়।
আর্টেমিস_স্লিড

4
%reset -fঅ-ইন্টারেক্টিভ হতে ব্যবহার করুন । stackoverflow.com/questions/38798181/…
জোছিম ওয়াগনার

28

আপনি যদি কোনও ফাংশন লিখেন তবে একবার এটি ছেড়ে গেলে ভিতরে সমস্ত নাম অদৃশ্য হয়ে যায়।

ধারণা বলা হয় নামস্থান এবং এটি তাই ভাল, এটি রূপ দেন Python- র জেন :

নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!

আইপথনের নেমস্পেসটি একইভাবে ম্যাজিক কমান্ড দিয়ে পুনরায় সেট করা যেতে পারে %reset -f। (এর -fঅর্থ "বল"; অন্য কথায়, "আমি সত্যিই সমস্ত ভেরিয়েবল মুছতে চাই কিনা তা আমাকে জিজ্ঞাসা করবেন না।")


4
আমি স্পষ্ট যুক্ত করব: আপনি যদি কোনও মূল ফাংশনের ভিতরে সমস্ত কিছু রাখেন (আমদানি সহ) আপনি অনুশীলনে এমন একটি কর্মক্ষেত্র পাবেন যা আপনি কেবলমাত্র সেই ফাংশনটি থেকে বেরিয়ে পুনরায় সেট করতে পারেন। আমি বিশ্বাস করি সত্যই এটাই প্রশ্নটির উদ্দেশ্য ছিল intended
ডেভিড

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


4
বা সরলভাবে%reset -sf
বাল কৃষ্ণা ঝা

4
আসলে,% রিসেট-এসএফ কমান্ডটি কাজ করে না এবং ত্রুটি ছুঁড়ে দেয়, যখন আপনি অ্যানাকোন্ডা প্রম্পট দিয়ে অজগর স্ক্রিপ্টটি চালান (এমনকি আপনি চেষ্টা করার পরেও - এটি কাজ করছে না)। আপনি একই চেষ্টা করতে পারেন এবং আপনি দেখতে পাবেন। তবে, আইপথন গ্রন্থাগার ব্যবহার প্রতিটি সমস্যার ক্ষেত্রে এই সমস্যাটি সমাধান করবে case
অনুরাগ গুপ্ত

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 () কল করার আগে "ক্লিয়ার = পুনরুদ্ধারকন্টেক্সট" একটি লাইনও যুক্ত করতে পারেন এবং ক্লিয়ার () মাতলাবের ক্লিয়ার মতো কাজ করবে।


4
দুর্দান্ত উত্তর! আমি পাইথন 3-এর জন্য বিশ্বাস করি আপনি পুনরুদ্ধারকন্টেক্সট এর সাথে সামঞ্জস্য করতে চান names = list(sys.modules[__name__].__dict__.keys()), অন্যথায় পাইথন অভিযোগ করবে যে আপনি অভিধানটির আকার পরিবর্তন করেছেন যখন এটির dict_keysঅবজেক্টের মাধ্যমে পুনরাবৃত্তি হবে ।
স্যাম বদার 4

এছাড়াও, যারা importএই উত্তরটি চান তাদের জন্য (যেমন আমি হোমকিউ কার্যভারের ক্ষেত্রে বিভিন্ন সমস্যার মধ্যে নাম স্থানটি পরিষ্কার করতে একটি বৃহত্তর নোটবুক থেকে এটি আমদানি করেছি), আমি মনে করি আপনি এর "__main__"পরিবর্তে ব্যবহার করতে চাইবেন __name__
স্যাম বদার 4

3

স্পাইডারে মেনুতে প্রতিটি প্রয়োগের আগে সমস্ত ভেরিয়েবল সাফ করার জন্য পাইথন ফাইলের জন্য আইপিথন কনসোলটি কনফিগার করতে পারেন Run -> Configuration -> General settings -> Remove all variables before execution


2

globals()ফাংশন একটি অভিধান, যেখানে কি বস্তু আপনার নাম করতে পারেন নাম ফেরৎ (এবং মূল্যবোধ, উপায় দ্বারা, হয় idএই বস্তুর গুলি) exec()ফাংশন একটি স্ট্রিং এবং এটি, executes হিসাবে যদি আপনি শুধু একটি পাইথন কনসোলে এটি টাইপ লাগে। সুতরাং, কোড হয়

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

যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে , আপনার প্রতিক্রিয়ার মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
স্টিফান ক্রেইন

ধন্যবাদ. এটা কি এখন ভাল?
কোলা.নি


0

প্রয়োজনীয় ভেরিয়েবলগুলি চালিয়ে ক্লাস তৈরির সহজ উপায়টি কি নয়? তারপরে সমস্ত কারেন্ট ভেরিয়েবলগুলির সাথে আপনার একটি অবজেক্ট রয়েছে এবং আপনার যদি প্রয়োজন হয় তবে আপনি এই ভেরিয়েবলটি ওভাররাইট করতে পারবেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.