<edit>
Właśnie uświadomiłem sobie misread pytanie i że nie próbujesz uzyskać atrybutów funkcji, ale wartości zmiennych lokalnych z funkcji. To, co chcesz zrobić, nie jest możliwe, ponieważ te zmienne lokalne nie są tworzone, dopóki funkcja nie zostanie uruchomiona, a zakres lokalny dla tej funkcji zostanie usunięty, gdy tylko funkcja zwróci lub zgłosi wyjątek.
Pozostawiam moją oryginalną odpowiedź, ponieważ możesz potencjalnie przepisać swoją funkcję, aby używać atrybutów zamiast zmiennych lokalnych i nadal używać tego dekoratora, aby skutecznie robić to, co chcesz.
Przydałoby się opublikować to, co aktualnie próbowano, i niektóre przykładowe wywołania z oczekiwanym wynikiem, jeśli działało poprawnie. </edit>
Kiedy potrzebujesz funkcji z atrybutów, to generalnie dobry pomysł, aby użyć wpłacone klasę zamiast normalnej definicji funkcji.
Oto przykład dekoratora gdzie owinięcie jest wywoływalnym klasy, który pozwala dekorator, aby uzyskać dostęp do zmiennych łatwo, ponieważ są one zmienne instancji klasy otoki:
def deco(func):
class Wrapper(object):
def __init__(self):
self.foo = None
def __call__(self, *args):
print 'old foo:', self.foo
result = func(*args)
print 'new foo:', self.foo
return result
return Wrapper()
@deco
def my_func(new_foo):
my_func.foo = new_foo
co skutkuje my_func
zachowania się tak:
>>> my_func('test')
old foo: None
new foo: test
>>> my_func.foo
'test'
>>> my_func(42)
old foo: test
new foo: 42
>>> my_func.foo
42
to działa. Zgadzam się, że jest to zły pomysł, ale byłem zainteresowany, czy to możliwe. – Harel
Świetna sztuczka. Robię debugger, który musi podstępnie chwytać elementy wewnętrzne z dekorowanej funkcji i dlatego jest to przydatne. Należy zauważyć, że tracer() jest nazywany nie tylko powrotem funkcji zdobionej, ale także zwrotem wszystkich funkcji wywoływanych z tej funkcji. Ponieważ dekorowana funkcja zawsze ma ostatni powrót, (i dlatego ustawia _locals na koniec) nie ma to znaczenia w tym przypadku. – Peter