Bir fonksiyonun bir dekoratör olmasının, bu fonksiyon çağrı detaylarını - parametrelerin isimlerini ve etkin değerlerini yazdıracağı bir işlev yapmak istiyorum. Benim şu andaki uygulama budur.Fonksiyon çağrı detaylarını yazdırmak için dekoratör - parametre isimleri ve etkin değerler
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)
Kinda, ancak bazı hatalar çalışır:
çağrı
içino
test (a = 1, b = 2, c = 3, d = 6, g = 12.9)
test(1, 2, 3, 4, 5, d = 6, g = 12.9)
.
beklenen sonuç burada saplanıp
test (a = 1, b = 2, c = 3, args = [4, 5], kwargs = {'d': 6, 'g': 12.9})
olduğunu. Doğru çözümü bulmama yardım edebilir misin?
Bu, hata ayıklama içinse, işlev dönüş değeri de gösterilmesinde kullanışlı olmayabilir mi? – Curt
@Curt evet – warvariuc