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
c'est à dire au moment ou j'essaye d'assigner via son nom la méthode avec point d'arret à la nouvelle classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part _watch.__dict__[method_name]= _watch._watched_method
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
(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)
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
Partager