Jest to pierwszy przykład, jaki spotykamy, gdy spotykamy się z dekoratorami. Ale nie jestem w stanie zrozumieć, co dokładnie chciałbym.Rejestrowanie w Pythonie przy użyciu dekoratora
Prosty dekorator o nazwie LOG. Powinno to działać tak:
@LOG
def f(a, b=2, *c, **d):
pass
A wynik powinien być mniej więcej tak:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Gdzie każdy argument przekazany jako parametr do funkcji jest pokazały swoją wartość.
Odkryłem, że problem jest trudniejszy, niż myślałem, głównie z powodu wielu różnych sposobów przekazywania argumentów funkcji (pomyśl o krotkach z * c lub słownikami z ** d).
Próbowałem rozwiązania, ale nie jestem pewien, czy to prawda. To somethink tak:
def LOG(fn):
import inspect
varList, _, _, default = inspect.getargspec(fn)
d = {}
if default is not None:
d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
def f(*argt, **argd):
print ('Enter %s' % fn).center(100, '=')
d.update(dict((varList[i], v) for i, v in enumerate(argt)))
d.update(argd)
for c in d.iteritems():
print '%s = %s' % c
ret = fn(*argt, **argd)
print 'return: %s' % ret
print ('Exit %s' % fn).center(100, '=')
return ret
return f
myślę, że to nie jest tak proste, jak się spodziewałem, ale to dziwne, że nie znaleziono, co chciałem w Google.
Czy możesz mi powiedzieć, czy moje rozwiązanie jest w porządku? Czy możesz zaproponować lepsze rozwiązanie problemu, który zaproponowałem?
Dziękuję wszystkim.
Czy to działa? Jeśli to działa, to jest w porządku. Jeśli nie, to masz problem. Zadaj nam konkretne pytanie dotyczące tego problemu. –
Tak, masz rację. Właściwie to działa. Ale jak napisałem, istnieje wiele złożonych sposobów przekazywania argumentów do funkcji Pythona: używanie krotek, słowników, domyślnych argumentów, ... Nawet jeśli wydaje się, że działa, nie jestem pewien, czy to poprawne implementacje, które będzie działać w każdym przypadku. – Luca
Sam będąc ofiarą padnięcia, czy ta funkcja, w absolutnie ogólnej formie, którą opisujesz, jest niezbędna do dalszego rozwijania aplikacji? Wygląda na to, że sam mechanizm rejestrowania przyciągnął twoją uwagę i wiem z doświadczenia, że może to być okropny zabójca produktywności. –