मुझे लगता है कि यह सजावट करने वाला नहीं है जो आपके प्रोफाइलिंग को छेड़छाड़ कर रहा है, बल्कि रैपर फ़ंक्शन सजावट द्वारा बनाया गया है। और ऐसा इसलिए हो रहा है क्योंकि सभी रैपर कार्यों का एक ही नाम है। इसे संबोधित करने के लिए, सजावटकर्ता ने रैपर फ़ंक्शन का नाम बदल दिया है।
def decorator(func):
def wrapper(*args):
print "enter func", func.__name__
return func(*args)
wrapper.__name__ += "_" + func.__name__
return wrapper
तुम भी functools.wraps()
इस्तेमाल कर सकते हैं, लेकिन तब आवरण समारोह के नाम पर समारोह यह लपेटकर है के नाम से मेल होगा। मुझे लगता है कि प्रोफाइलिंग के लिए ठीक होगा।
अब, फ़ंक्शन के कोड ऑब्जेक्ट का नाम भी है। पाइथन स्टैक्स पर फ़ंक्शंस के संदर्भों को संदर्भित नहीं करता है, केवल कोड ऑब्जेक्ट्स के लिए, इसलिए यदि प्रोफाइलर को स्टैक्स फ्रेम से रैपर फ़ंक्शन का नाम मिल रहा है, तो यह यह नाम प्राप्त होगा। सामान्य तरीके से परिभाषित रैपर कोड ऑब्जेक्ट को साझा करते हैं (भले ही फ़ंक्शन ऑब्जेक्ट अलग है) जब तक कि आप स्पष्ट रूप से प्रत्येक ऑब्जेक्ट फ़ंक्शन के लिए कोड ऑब्जेक्ट और फ़ंक्शन ऑब्जेक्ट का पुनर्निर्माण नहीं करते। यह काफी अधिक काम है और बहुत सीपीथॉन-विशिष्ट (संस्करण-विशिष्ट भी हो सकता है)। लेकिन यहाँ कैसे आप इसके बारे में जाना दे सकता है:
from types import FunctionType, CodeType
def decorator(func):
def wrapper(*args):
print "enter func", func.__name__
return func(*args)
name = wrapper.__name__ + "_" + func.__name__
func_code = wrapper.func_code
new_code = CodeType(
func_code.co_argcount, func_code.co_nlocals, func_code.co_stacksize,
func_code.co_flags, func_code.co_code, func_code.co_consts,
func_code.co_names, func_code.co_varnames, func_code.co_filename,
name, func_code.co_firstlineno, func_code.co_lnotab,
func_code.co_freevars, func_code.co_cellvars)
wrapper = FunctionType(
new_code, wrapper.func_globals, name, wrapper.func_defaults,
wrapper.func_closure)
return wrapper
दोनों समारोह का नाम और कोड वस्तु का नाम यहाँ wrapper_originalfuncname
की तैयारी में हैं और वे इस प्रकार प्रोफाइलर में लिपटे समारोह से अलग की जाती किया जाना चाहिए। आप आसानी से उन्हें केवल मूल कार्य के नाम पर सेट कर सकते हैं ताकि उनके रन टाइम को इसके बजाय मूल फ़ंक्शन के साथ रोल किया जा सके।
क्यों कि उपयोगी नहीं है ? यदि प्रोफाइलिंग सजावट सजावटी की ओर इंगित करती है, तो सजावटी कार्यान्वयन में किए गए किसी भी सुधार में बड़े बदलाव हो सकते हैं। – jcollado
jcollado: क्योंकि सजावटी रनटाइम का एक छोटा हिस्सा है, लेकिन यह कॉलली नहीं हैं।यह मुखौटा उन कॉलियों का "सच्चा कॉलर" क्या है, जो ऑप्टिमाइज़ करने का निर्णय लेने में जानकारी का एक महत्वपूर्ण टुकड़ा हो सकता है। – bukzor