10
votes

Intercepter les opérations de tranches en python

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". xxx

ceci fonctionne pour d'autres méthodes telles que Ajoutez et étendre , juste Pas pour les opérations de la tranche.

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.


5 commentaires

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 est obsolète tinyurl.com/kr3gxn


Quelle version de Jython utilisez-vous?


4 Réponses :


5
votes

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).


0 commentaires

5
votes

"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)


1 commentaires

Pas vrai si vous héritez d'une liste __SetsLice__ et __GetsLice__ sont toujours là et SettiTem / GetItem ne s'appelle pas du tout.



4
votes

Les circonstances où __ getlice __ et __ setslice __ 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 __ ou __ settitem __ est appelé.


0 commentaires

5
votes

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>

code h2> xxx pré>

jython 2.5 h2> xxx pré>

python 2.6.2 h2>
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)


0 commentaires