1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """
20 Resource manager.
21 """
22
23 import weakref
24
25
27 """
28 A registry of objects and resources that should be closed when those
29 objects are deleted.
30
31 This is meant to be a safer alternative to Python's ``__del__`` method,
32 which can cause reference cycles to never be collected. Objects registered
33 with the ResourceManager can be collected but still free resources when
34 they die.
35
36 Resources are registered using `register`, and when an object is garbage
37 collected, each registered resource is closed by having its ``close()``
38 method called. Multiple resources may be registered per object, but a
39 resource will only be closed once, even if multiple objects register it.
40 (The last object to register it wins.)
41 """
42
45
47 """
48 Register a resource to be closed with an object is collected.
49
50 When the given ``obj`` is garbage-collected by the Python interpreter,
51 the ``resource`` will be closed by having its ``close()`` method called.
52 Any exceptions are ignored.
53
54 :param object obj: the object to track
55 :param object resource:
56 the resource to close when the object is collected
57 """
58 def callback(ref):
59 try:
60 resource.close()
61 except:
62 pass
63 del self._table[id(resource)]
64
65
66
67 self._table[id(resource)] = weakref.ref(obj, callback)
68
69
70
71 ResourceManager = ResourceManager()
72