मैं प्रदर्शन बढ़ाने के उद्देश्य से एक सजावटी बनाने के बारे में सोच रहा था। एक सजावट जो उस समारोह के स्रोत कोड को संशोधित करता है जो इसे सजाने के लिए संशोधित करता है, और संशोधित फ़ंक्शन देता है।सजावट में कार्य संशोधित करें
इस बारे में सोचते समय, मुझे लगा कि अगर मुझे फ़ंक्शन का स्रोत कोड मिल सकता है, तो मैं यह कर सकता हूं। लेकिन क्या एक सजावट के अंदर एक समारोह के स्रोत कोड का उपयोग करना संभव है? अगर मैं इस तरह की एक डेकोरेटर है:
import inspect
def decorate(f):
exec(inspect.getsource(f))
return eval(f.__name__)
@decorate
def test():
return 1
मैं एक OSError मिलती है:
OSError: could not get source code
इसका कारण यह है test
पूरी तरह से पहले यह decorate
में पारित हो जाता से नहीं बना है प्रतीत होता है। हालांकि, यह काम करता है:
import inspect
def decorate(f):
exec(inspect.getsource(f))
return eval(f.__name__)
def test():
return 1
test = decorate(test)
हालांकि इसमें उस सजावटी फ्लेयर नहीं है, हालांकि। ऐसा लगता है कि यह संभव हो सकता है, क्योंकि f.__code__
परिभाषित किया गया है।
से देखने पर, ऐसा लगता है कि यह केवल होता है जब मैं exec
में inspect.getsource(f)
डाल दिया। अन्यथा, ऐसा लगता है कि मैं स्रोत कोड प्राप्त कर सकता हूं।
मेरे दिमाग में पहली चीज का एक मोटा स्केच के रूप में, मैं पूंछ-रिकर्सन के बारे में सोच रहा हूं। मैं इस डेकोरेटर कि दुर्भाग्य से धीमी है और सजाया जा करने के लिए समारोह लिखने की एक बहुत विशिष्ट शैली की आवश्यकता है लिखा है:
def tail_recurse(acc_default):
def decorate(f):
def wrapper(*args, acc=acc_default):
args = args + (acc,)
while True:
return_type, *rargs = f(*args)
if return_type is None:
return rargs[-1]
args = rargs
return wrapper
return decorate
असल में, मैं के साथ एक समारोह के शरीर की जगह के रूप में सरल कुछ करने का सोच रहा हूँ:
while True:
__body__
update_args
अस्थिर शायद –
के लिए अधिक उपयुक्त है 'exec (inspect.getsource (f)) से पहले एक पंक्ति खाली छोड़ दें और यह काम करेगा। दिलचस्प !! –
@ अश्विनी चौधरी यह मेरे लिए कुछ भी नहीं करता .... लेकिन इससे मुझे लगता है कि यह एक सहमति मुद्दा हो सकता है, या कार्यान्वयन निर्भर – Justin