Bonjour,

Comment faire pour surcharger une méthode dont on ne connait que le nom ?

Cette question m'est apparue sur l'exemple suivant:

Je cherche à décorer une classe de sorte qu'un point d'arret soit rencontré lorsqu'une certaine méthode est appelée. Mon problème vient de ce que je ne connais que le nom de la methode (method_name dans le code).

L'exception
TypeError: 'dictproxy' object does not support item assignment
est levée par la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
_watch.__dict__[method_name]= _watch._watched_method
c'est à dire au moment ou j'essaye d'assigner via son nom la méthode avec point d'arret à la nouvelle classe.

Est-ce le fait que la classe _watch soit intérieure à une fonction qui fait que sont __dict__ est un dictproxy ? Comment puis-je faire ?

Merci d'avance


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
def any_args(self,*a,**k): return True
 
def watch_call(method_name,arg_test= any_args):
    def make_watcher(obj):
        class _watch(obj):
            def __init__(self,*a,**k): obj.__init__(self,*a,**k)
            def _watched_method(self,*a,**k):
                if arg_test(self,*a,**k):
                    WATCH_DEBUG= None # POINT D'ARRET ICI
                return obj.__dict__["method_name"](self,*a ,**k)
        _watch.__dict__[method_name]= _watch._watched_method
        return _watch
    return make_watcher
 
if __name__== "__main__":
    l= watch_call("append")(list)()
    l.append(1) # cet appel doit passer par le point d'arret
(arg_test permet juste de ne passer sur le point d'arret que lorsque les arguments de la méthodes vérifient une condition donnée)