मेरे पास एक साधारण छोटा सजावट है, जो कैश को फ़ंक्शन एट्रिब्यूट के रूप में dict
में फ़ंक्शन कॉल से परिणाम देता है।किसी फ़ंक्शन विशेषता को पुन: असाइन करें, यह 'पहुंच योग्य' बनाता है
from decorator import decorator
def _dynamic_programming(f, *args, **kwargs):
try:
f.cache[args]
except KeyError:
f.cache[args] = f(*args, **kwargs)
return f.cache[args]
def dynamic_programming(f):
f.cache = {}
return decorator(_dynamic_programming, f)
अब मैं कैश को खाली करने की संभावना जोड़ना चाहता हूं। तो मैं इस तरह dynamic_programming()
समारोह बदलने के लिए:
def dynamic_programming(f):
f.cache = {}
def clear():
f.cache = {}
f.clear = clear
return decorator(_dynamic_programming, f)
अब मैं एक फाइबोनैचि संख्या समारोह को लागू करने के लिए इस छोटी बात का उपयोग मान लें:
@dynamic_programming
def fib(n):
if n <= 1:
return 1
else:
return fib(n-1) + fib(n-2)
>>> fib(4)
5
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
लेकिन अब जब मैं कैश कुछ अजीब स्पष्ट होता है:
:>>> fib.clear()
>>> fib.cache
{(0,): 1, (1,): 1, (2,): 2, (3,): 3, (4,): 5}
या (एक नई पायथन गिरी चल के साथ) यह इसका उल्टा करना
>>> fib.clear()
>>> fib(4)
5
>>> fib.cache
{}
कैश किसी भी तरह से पहली पहुंच के बाद 'पहुंचने योग्य' क्यों नहीं है, यानी clear()
पर कॉल करने के बाद या clear()
के बाद कॉल करने पर कॉल क्यों नहीं हो रहा है?
(। Btw मैं एक समाधान सही ढंग से कैश को साफ़ करने के लिए पता है:। f.cache.clear()
बुला के बजाय यह करने के लिए {}
बताए काम करता है की उम्मीद के रूप में मैं केवल कारण क्यों बताए समाधान में विफल रहता है में दिलचस्पी रखता हूँ।)
मेरे सबसे लंबे समय तक पद पर अभी तक , इसे देखकर ... :) – matsjoyce