Staging
v0.5.1
https://github.com/python/cpython
Revision 2070be82cd91847b415c646b16393d8b1dfddabc authored by R. David Murray on 10 February 2010, 22:47:57 UTC, committed by R. David Murray on 10 February 2010, 22:47:57 UTC
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78137 | r.david.murray | 2010-02-10 17:42:04 -0500 (Wed, 10 Feb 2010) | 8 lines

  Issue 7835:  Shelve's __del__ method calls its close method, and its
  close method refers to an identifier in the global module namespace.
  This means that when __del__ is called during interpreter shutdown (if,
  for example, the calling program still has a pointer to the shelf),
  sometimes that global identifier would wind up being None, causing
  mysterious 'ignored' exceptions.  This patch checks for the possible None
  value first before using the global, thus avoiding the error messages.
........
1 parent 8ed66ed
Raw File
Tip revision: 2070be82cd91847b415c646b16393d8b1dfddabc authored by R. David Murray on 10 February 2010, 22:47:57 UTC
Merged revisions 78137 via svnmerge from
Tip revision: 2070be8
Percolator.py
from WidgetRedirector import WidgetRedirector
from Delegator import Delegator

class Percolator:

    def __init__(self, text):
        # XXX would be nice to inherit from Delegator
        self.text = text
        self.redir = WidgetRedirector(text)
        self.top = self.bottom = Delegator(text)
        self.bottom.insert = self.redir.register("insert", self.insert)
        self.bottom.delete = self.redir.register("delete", self.delete)
        self.filters = []

    def close(self):
        while self.top is not self.bottom:
            self.removefilter(self.top)
        self.top = None
        self.bottom.setdelegate(None); self.bottom = None
        self.redir.close(); self.redir = None
        self.text = None

    def insert(self, index, chars, tags=None):
        # Could go away if inheriting from Delegator
        self.top.insert(index, chars, tags)

    def delete(self, index1, index2=None):
        # Could go away if inheriting from Delegator
        self.top.delete(index1, index2)

    def insertfilter(self, filter):
        # Perhaps rename to pushfilter()?
        assert isinstance(filter, Delegator)
        assert filter.delegate is None
        filter.setdelegate(self.top)
        self.top = filter

    def removefilter(self, filter):
        # XXX Perhaps should only support popfilter()?
        assert isinstance(filter, Delegator)
        assert filter.delegate is not None
        f = self.top
        if f is filter:
            self.top = filter.delegate
            filter.setdelegate(None)
        else:
            while f.delegate is not filter:
                assert f is not self.bottom
                f.resetcache()
                f = f.delegate
            f.setdelegate(filter.delegate)
            filter.setdelegate(None)


def main():
    class Tracer(Delegator):
        def __init__(self, name):
            self.name = name
            Delegator.__init__(self, None)
        def insert(self, *args):
            print self.name, ": insert", args
            self.delegate.insert(*args)
        def delete(self, *args):
            print self.name, ": delete", args
            self.delegate.delete(*args)
    root = Tk()
    root.wm_protocol("WM_DELETE_WINDOW", root.quit)
    text = Text()
    text.pack()
    text.focus_set()
    p = Percolator(text)
    t1 = Tracer("t1")
    t2 = Tracer("t2")
    p.insertfilter(t1)
    p.insertfilter(t2)
    root.mainloop()
    p.removefilter(t2)
    root.mainloop()
    p.insertfilter(t2)
    p.removefilter(t1)
    root.mainloop()

if __name__ == "__main__":
    from Tkinter import *
    main()
back to top