Je veux imiter une liste de python normale, sauf chaque fois que des éléments sont ajoutés ou supprimés via la tranchée, je souhaite "enregistrer" la liste. Est-ce possible? C'était ma tentative, mais il n'imprimera jamais la "sauvegarde". ceci fonctionne pour d'autres méthodes telles que Edit: Le vrai problème est que j'utilise Jython et pas python et l'a oublié. Les commentaires sur la question sont corrects. Ce code fonctionne bien à Python (2.6). Cependant, le code ni les réponses fonctionnent à Jython. Em> p> p> Ajoutez code> et
étendre code>, juste Pas pour les opérations de la tranche. P>
4 Réponses :
du Python 3 docs :
__getslice__(), __setslice__() and __delslice__() were killed. The syntax a[i:j] now translates to a.__getitem__(slice(i, j)) (or __setitem__() or __delitem__(), when used as an assignment or deletion target, respectively).
"SetSlice" et "DelSlice" sont obsolètes, si vous voulez faire l'interception, vous devez travailler avec des objets de tranche Python transmis à "Settitem" et "Delitem". Si vous souhaitez intégrer à la fois des tranches et des accès ordinaires, ce code fonctionne parfaitement dans Python 2.6.2.
class InterceptedList(list): def addSave(func): def newfunc(self, *args): func(self, *args) print 'saving' return newfunc def __setitem__(self, key, value): print 'saving' list.__setitem__(self, key, value) def __delitem__(self, key): print 'saving' list.__delitem__(self, key)
Pas vrai si vous héritez d'une liste __SetsLice__ et __GetsLice__ sont toujours là et SettiTem / GetItem ne s'appelle pas du tout.
Les circonstances où __ getlice __ code> et
__ setslice __ code> sont appelés sont assez étroits. Plus précisément, la découpe ne se produit que lorsque vous utilisez une tranche régulière, où les éléments de première et extrémité sont mentionnés exactement une fois. Pour toute autre syntaxe de tranche, ou sans tranches du tout,
__ getItem __ code> ou
__ settitem __ code> est appelé. p>
C'est assez de spéculation. Commençons par utiliser des faits au lieu de cela? Pour autant que je sache, le résultat final est que vous devez remplacer à la fois un ensemble de méthodes.
Si vous souhaitez implémenter Annuler / Redo, vous devriez probablement essayer d'utiliser Annuler une pile et une série d'actions pouvant faire () / annuler () eux-mêmes. p>
C:\Users\wuu-local.pyza\Desktop>python intercept.py 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] ------------Testing setslice------------------ saving 4 function calls in 0.002 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.002 0.002 0.002 0.002 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 intercept.py:9(newfunc) 1 0.000 0.000 0.002 0.002 profile:0(l[3:] = [5]) 0 0.000 0.000 profile:0(profiler) saving 4 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 intercept.py:9(newfunc) 1 0.000 0.000 0.000 0.000 profile:0(l[2:6] = [12, 4]) 0 0.000 0.000 profile:0(profiler) saving 4 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 intercept.py:9(newfunc) 1 0.000 0.000 0.000 0.000 profile:0(l[-1:] = [42]) 0 0.000 0.000 profile:0(profiler) 3 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 profile:0(l[::2] = [6,6]) 0 0.000 0.000 profile:0(profiler) -----------Testing setitem-------------------- 3 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 profile:0(l2[3:] = [5]) 0 0.000 0.000 profile:0(profiler) 3 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 profile:0(l2[2:6] = [12,4]) 0 0.000 0.000 profile:0(profiler) 3 function calls in 0.000 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 profile:0(l2[-1:] = [42]) 0 0.000 0.000 profile:0(profiler) saving 4 function calls in 0.003 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.003 0.003 <string>:1(<module>) 1 0.002 0.002 0.002 0.002 intercept.py:20(__setitem__) 1 0.000 0.000 0.003 0.003 profile:0(l2[::2] = [6,6]) 0 0.000 0.000 profile:0(profiler)
Je viens de copier et collé votre code dans Python 2.5.1 et il imprimait «économie» comme prévu.
Ça marche ici. Python 2.6.2 sous Windows.
En utilisant 2.5.2. "Sauvegarde" imprimée pendant l'opération EXTERMINE () mais pas pendant l'attribution de la tranche.
Peut-être que c'est parce que SetSlice B> est obsolète tinyurl.com/kr3gxn
Quelle version de Jython utilisez-vous?