परिवर्तनशील डिफ़ॉल्ट तर्क मूल्यों के लिए अच्छे उपयोग के सवाल के जवाब में, मैं निम्नलिखित उदाहरण प्रस्तुत करता हूं:
एक उत्परिवर्तनीय डिफ़ॉल्ट उपयोग करने में आसान प्रोग्राम बनाने के लिए उपयोगी हो सकता है, अपने स्वयं के निर्माण के आयात योग्य आदेश। म्यूट डिफॉल्ट मेथड राशि में एक फंक्शन में निजी, स्टैटिक वेरिएबल्स होते हैं जिन्हें आप पहली कॉल पर इनिशियलाइज़ कर सकते हैं (एक क्लास की तरह बहुत कुछ) लेकिन ग्लॉबल्स का सहारा लिए बिना, बिना रैपर का उपयोग किए बिना, और बिना किसी इंस्टेंट के तुरंत वर्ग वस्तु जो आयात की गई थी। यह अपने तरीके से सुरुचिपूर्ण है, जैसा कि मुझे आशा है कि आप सहमत होंगे।
इन दो उदाहरणों पर विचार करें:
def dittle(cache = []):
from time import sleep
if type(cache) != list or cache !=[] and (len(cache) == 2 and type(cache[1]) != int):
print(" User called dittle("+repr(cache)+").\n >> Warning: dittle() takes no arguments, so this call is ignored.\n")
return
if not cache:
print("\n cache =",cache)
print(" Initializing private mutable static cache. Runs only on First Call!")
cache.append("Hello World!")
cache.append(0)
print(" cache =",cache,end="\n\n")
cache[1]+=1
outstr = " dittle() called "+str(cache[1])+" times."
if cache[1] == 1:outstr=outstr.replace("s.",".")
print(outstr)
print(" Internal cache held string = '"+cache[0]+"'")
print()
if cache[1] == 3:
print(" Let's rest for a moment.")
sleep(2.0)
print(" Wheew! Ready to continue.\n")
sleep(1.0)
elif cache[1] == 4:
cache[0] = "It's Good to be Alive!"
if __name__ == "__main__":
for cnt in range(2):dittle()
print(" Attempting to pass an list to dittle()")
dittle([" BAD","Data"])
print(" Attempting to pass a non-list to dittle()")
dittle("hi")
print(" Calling dittle() normally..")
dittle()
print(" Attempting to set the private mutable value from the outside.")
dittle([" I am a Grieffer!\n (Notice this change will not stick!)",-7])
print(" Calling dittle() normally once again.")
dittle()
dittle()
यदि आप इस कोड को चलाते हैं, तो आप देखेंगे कि बहुत पहले कॉल पर dittle () फ़ंक्शन आंतरिक रूप से आंतरिक हो जाता है, लेकिन अतिरिक्त कॉल पर नहीं, यह कॉल के बीच आंतरिक स्थिर भंडारण के लिए एक निजी स्थिर कैश (परस्पर डिफ़ॉल्ट) का उपयोग करता है, अपहृत करने के प्रयासों को अस्वीकार करता है। स्थैतिक भंडारण, दुर्भावनापूर्ण इनपुट के लिए लचीला है, और गतिशील स्थितियों के आधार पर कार्य कर सकता है (यहां फ़ंक्शन को कॉल किए जाने की संख्या के आधार पर।)
परिवर्तनशील चूक का उपयोग करने के लिए महत्वपूर्ण कुछ भी नहीं है जो चर को स्मृति में पुन: सौंप देगा, लेकिन हमेशा चर को जगह में बदलने के लिए।
इस तकनीक की संभावित शक्ति और उपयोगिता को वास्तव में देखने के लिए, "DITTLE.py" नाम के तहत इस पहले प्रोग्राम को अपनी वर्तमान निर्देशिका में सहेजें, फिर अगला प्रोग्राम चलाएं। यह आयात करता है और याद रखने या प्रोग्राम करने के लिए किसी भी चरण की आवश्यकता के बिना हमारे नए डिटल () कमांड का उपयोग करता है।
यहाँ हमारा दूसरा उदाहरण है। इसे एक नए प्रोग्राम के रूप में संकलित करें और चलाएं।
from DITTLE import dittle
print("\n We have emulated a new python command with 'dittle()'.\n")
dittle()
dittle()
dittle()
dittle()
dittle()
अब नहीं है कि के रूप में के रूप में चालाक और साफ हो सकता है? ये परिवर्तनशील चूक वास्तव में काम आ सकती हैं।
========================
थोड़ी देर के लिए मेरे जवाब को प्रतिबिंबित करने के बाद, मुझे यकीन नहीं है कि मैंने एक ही चीज़ को पूरा करने के लिए म्यूट करने योग्य डिफ़ॉल्ट विधि और नियमित तरीके का उपयोग करने के बीच अंतर किया है।
नियमित रूप से एक आयात योग्य फ़ंक्शन का उपयोग करना है जो एक क्लास ऑब्जेक्ट लपेटता है (और एक वैश्विक का उपयोग करता है)। तो तुलना के लिए, यहां एक क्लास-आधारित पद्धति है जो समान डिफ़ॉल्ट विधि के समान कार्य करने का प्रयास करती है।
from time import sleep
class dittle_class():
def __init__(self):
self.b = 0
self.a = " Hello World!"
print("\n Initializing Class Object. Executes on First Call only.")
print(" self.a = '"+str(self.a),"', self.b =",self.b,end="\n\n")
def report(self):
self.b = self.b + 1
if self.b == 1:
print(" Dittle() called",self.b,"time.")
else:
print(" Dittle() called",self.b,"times.")
if self.b == 5:
self.a = " It's Great to be alive!"
print(" Internal String =",self.a,end="\n\n")
if self.b ==3:
print(" Let's rest for a moment.")
sleep(2.0)
print(" Wheew! Ready to continue.\n")
sleep(1.0)
cl= dittle_class()
def dittle():
global cl
if type(cl.a) != str and type(cl.b) != int:
print(" Class exists but does not have valid format.")
cl.report()
if __name__ == "__main__":
print(" We have emulated a python command with our own 'dittle()' command.\n")
for cnt in range(2):dittle()
print(" Attempting to pass arguments to dittle()")
try:
dittle(["BAD","Data"])
except:
print(" This caused a fatal error that can't be caught in the function.\n")
print(" Calling dittle() normally..")
dittle()
print(" Attempting to set the Class variable from the outside.")
cl.a = " I'm a griefer. My damage sticks."
cl.b = -7
dittle()
dittle()
अपनी वर्तमान निर्देशिका में इस कक्षा-आधारित कार्यक्रम को DITTLE.py के रूप में सहेजें और फिर निम्न कोड (जो पहले जैसा हो) चलाएं।
from DITTLE import dittle
dittle()
dittle()
dittle()
dittle()
dittle()
दो तरीकों की तुलना करके, एक फ़ंक्शन में एक म्यूट डिफ़ॉल्ट का उपयोग करने के फायदे स्पष्ट होने चाहिए। परिवर्तनशील डिफ़ॉल्ट विधि को कोई ग्लोबल्स की आवश्यकता नहीं है, यह आंतरिक चर सीधे सेट नहीं किया जा सकता है। और जब उत्परिवर्तनीय विधि ने एक चक्र के लिए एक जानकार पारित तर्क को स्वीकार कर लिया, तो इसे बंद कर दिया, क्लास पद्धति को स्थायी रूप से बदल दिया गया क्योंकि इसका आंतरिक चर सीधे बाहर के संपर्क में है। किस विधि के लिए प्रोग्राम करना आसान है? मुझे लगता है कि तरीकों और आपके लक्ष्यों की जटिलता के साथ आपके आराम स्तर पर निर्भर करता है।