3 votes

Comment accéder aux variables locales d'une méthode décorée ( locals() ) à partir d'un décorateur Python ?

Voici ce dont j'ai besoin :

Disons que j'ai ce décorateur :

def deco(func):
    def decoret(*args, **kwargs):
        print(func.__locals__) # I know __locals__ is not valid, but I need something like this
    return decoret

@deco
def func():
    test1 = 123
    test2 = 456

func()

Je veux récupérer une liste de toutes les variables locales (comme si j'appelais locals() à l'intérieur de la fonction), ce qui me permettrait d'accéder à une fonction dictionnaire avec les valeurs de test1 et test2 à l'intérieur du décorateur décoret fonction.

Je sais que je peux le faire en utilisant le module Python inspect, mais je n'ai pas réussi à trouver le bon cadre pour obtenir la fonction.

De plus, j'utilise Python 3.2 CPython.

3voto

agf Points 45052

Il y a sont aucun local dans une fonction avant qu'elle ne soit exécutée. Les seules choses dont vous disposez lorsqu'elle est décorée sont celles qui sont là lorsqu'elle est définie.

d = 'd'
def a(d=d):
    b = 'b'
    c = 'c'

print a.__dict__
# {}
print a.b
# AttributeError: 'function' object has no attribute 'b'
print dir(a)
# Doesn't print anything

1voto

ygbr Points 313

En fait, j'ai trouvé un moyen de contourner et d'implémenter ceci en utilisant une trace de sys.

Jetez un coup d'œil à cet extrait :

def Property(function):
    keys = 'fget', 'fset', 'fdel'
    func_locals = {'doc':function.__doc__}
    def probeFunc(frame, event, arg):
        if event == 'return':
            locals = frame.f_locals
            func_locals.update(dict((k,locals.get(k)) for k in keys))
            sys.settrace(None)
        return probeFunc
    sys.settrace(probeFunc)
    function()
    return property(**func_locals)

Je me suis inspiré d'un bout de code situé à l'adresse suivante http://code.activestate.com/recipes/410698/

Jetez également un coup d'œil à ce sujet sur stackoverflow : Python : décorateur de variable statique

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X