मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो किसी अन्य फ़ंक्शन में सजावट करने वाला फ़ंक्शन कॉल विवरण प्रिंट करेगा - पैरामीटर नाम और प्रभावी मान। मेरा वर्तमान कार्यान्वयन यह है।फ़ंक्शन कॉल विवरण मुद्रित करने के लिए सजावटी - पैरामीटर नाम और प्रभावी मान
def describeFuncCall(func):
'''Decorator to print function call details - parameters names and effective values'''
def wrapper(*func_args, **func_kwargs):
print 'func_code.co_varnames =', func.func_code.co_varnames
print 'func_code.co_argcount =', func.func_code.co_argcount
print 'func_args =', func_args
print 'func_kwargs =', func_kwargs
params = []
for argNo in range(func.func_code.co_argcount):
argName = func.func_code.co_varnames[argNo]
argValue = func_args[argNo] if argNo < len(func_args) else func.func_defaults[argNo - func.func_code.co_argcount]
params.append((argName, argValue))
for argName, argValue in func_kwargs.items():
params.append((argName, argValue))
params = [ argName + ' = ' + repr(argValue) for argName, argValue in params]
print(func.__name__ + ' (' + ', '.join(params) + ')')
return func(*func_args, **func_kwargs)
return wrapper
@describeFuncCall
def test(a, b = 4, c = 'blah-blah', *args, **kwargs):
pass
test(1)
#test(1, 3)
#test(1, d = 5)
test(1, 2, 3, 4, 5, d = 6, g = 12.9)
किंडा काम करता है, लेकिन कुछ कीड़े के साथ:
कॉल
लिएtest(1, 2, 3, 4, 5, d = 6, g = 12.9)
यह प्रिंट
test (a = 1, b = 2, c = 3, d = 6, g = 12.9)
।
अपेक्षित परिणाम
test (a = 1, b = 2, c = 3, args = [4, 5], kwargs = {'d': 6, 'g': 12.9})
मैं यहाँ अटक गया है। क्या आप सही समाधान खोजने में मेरी मदद कर सकते हैं?
यदि यह डिबगिंग के लिए है, तो यह फ़ंक्शन रिटर्न वैल्यू दिखाने के लिए भी उपयोगी नहीं हो सकता है? – Curt
@Curt हाँ, यकीन है कि – warvariuc