क्या एक सजावट लिखने का कोई तरीका है जैसे कि निम्नलिखित काम करेगा?क्या मैं पाइथन में किसी फ़ंक्शन के स्थानीय दायरे को बदलने के लिए सजावट का उपयोग कर सकता हूं?
assert 'z' not in globals()
@my_decorator
def func(x, y):
print z
संपादित करें: वाक्य रचना चीनी/सूखी: हॉप की "? क्यों" करने के लिए anwser
से चले गए जवाब में।
यह कैशिंग के बारे में नहीं है, यह x & y के मानों के आधार पर z (और z1, z2, z3, ...) की गणना करने के बारे में है।
मैं कार्य करता है जो संबंधित बातें करते हैं के बहुत सारे है, और मैं ऐसा नहीं करना चाहता हर एक समारोह की शुरुआत में
z1, z2, z3=calculate_from(x, y)
लिखने के लिए है - क्या मैं कहीं गलत यह मिल जाएगा। अगर यह सी था तो मैं इसे सीपीपी के साथ करूँगा (अगर यह लापरवाह था, तो मैं मैक्रोज़ के साथ ऐसा करूँगा ...), लेकिन मैं देखना चाहता था कि सजावटी एक ही काम कर सकते हैं या नहीं।
यदि यह मदद करता है, तो मैं लगभग निश्चित रूप से सजावटी "precalculate_z" को कॉल करता हूं, और यह निश्चित रूप से किसी भी सार्वजनिक एपीआई का हिस्सा नहीं होगा।
मैं शायद के साथ-साथ विश्वस्तरीय अधोसंरचना का उपयोग करने से एक समान प्रभाव हो सकता है, लेकिन मैं यह देखने के लिए अगर यह कच्चे कार्यों के साथ संभव था चाहता था।
मुझे यकीन नहीं है कि आप यहां क्या करने की कोशिश कर रहे हैं - यदि 'z' न तो वैश्विक है और न ही कोई फ़ंक्शन तर्क है, तो यह कहां से आता है? या आप 'z' स्थिर बनाना चाहते हैं? पायथन सी-शैली स्थिर चर का समर्थन नहीं करता है, लेकिन आप अपने कार्य को कक्षा में डालकर एक ही चीज़ को पूरा कर सकते हैं। –
मुझे विश्वास है कि वह पूछ रहा है कि 'my_decorator' स्थानीय चर को उस समारोह के शरीर में इंजेक्ट कर सकता है जो इसे सजा रहा है। – Aaron