पायथन जटिल अज्ञात कार्यों का समर्थन नहीं करता है। एक अच्छा विकल्प क्या है? उदाहरण के लिए:पायथन: अज्ञात कार्यों के विकल्प
class Calculation:
def __init__(self, func):
self.func = func
def __call__(self, data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[self.func]
except KeyError:
pass # first-time call; calculate and cache the values
data[self.func] = self.func(data)
return data[self.func]
# with a simple function, which can be represented using lambda, this works great
f1 = Calculation(lambda data : data['a'] * data['b'])
# with a complicated function, I can do this:
def f2_aux:
# some complicated calculation, which isn't suitable for a lambda one-liner
f2 = Calculation(f2_aux)
क्या यह एक उचित डिजाइन शुरू करने के लिए है?
यदि हां, तो क्या मॉड्यूल में परिभाषित प्रत्येक एफ * के लिए f * _aux की कुरूपता से बचने का कोई तरीका है?
अद्यतन:
उपयोग का उदाहरण:
d = {'a' : 3, 'b' : 6}
# computes 3 * 6
# stores 18 in d under a key <function <lambda> at ...>
# returns 18
f1(d)
# retrieves 18 from d[<function <lambda> at ...>]
# returns 18, without having to recalculate it
f1(d)
अद्यतन:
बस मेरी समझ के लिए, मैं भीतरी समारोह का उपयोग करता है एक संस्करण जोड़ा।
def memoize(func):
def new_func(data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[func]
except KeyError:
pass # first-time call; calculate and cache the values
data[func] = func(data)
return data[func]
return new_func
@memoize
def f1(data):
return data['a'] * data['b']
नहीं, यह उचित डिजाइन नहीं है। आप यादें कर रहे हैं (जो अज्ञात कार्यों से असंबंधित है), और इसे बुरी तरह से कर रहा है। 'f1 = lambda a: अभिव्यक्ति' हमेशा 'def f1 (ए): वापसी अभिव्यक्ति' जैसा ही है। [यह अध्ययन करने के लिए एक अच्छा ज्ञापन सजावट है] (http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize)। बीटीडब्लू, '@ डिकोरेटर डीफ़ फ़ंक्शन: पास' हमेशा' डीफ़ फ़ंक्शन: पास के समान ही होता है; समारोह = सजावट (कार्य) ' –
क्या बुरा है यह है कि आपका ज्ञापन टूट गया है। परिणाम कैश 'डेटा' भी आपके फ़ंक्शन का तर्क है ... –
@ फ्रैंकिसएविला: मैं शब्द तत्व 'डेटा [f]' में 'f (डेटा)' के मान को कैश करना चाहता था। मुझे पता है कि मेरे पास पास किया गया डेटा कभी भी ऐसी कुंजी का उपयोग नहीं करेगा - और दूसरे के साथ संघर्ष तब नहीं होना चाहिए जब किसी अन्य कार्य के मूल्य को किसी अन्य कुंजी के अंतर्गत कैश किया जाएगा। ऐसा लगता है जैसे यह काम करता है (तकनीकी रूप से); अनावश्यक रूप से भ्रमित कोड में समस्या क्या है? – max