Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7a49d20

Browse files
committed
Add a unique number to any renderer hash keys.
The result of id() is only guaranteed to be unique for objects that exist at the same time. This global integer is a quick and light way to ensure that new renderers that match an old one don't produce the same caching key.
1 parent 8a0e56e commit 7a49d20

4 files changed

Lines changed: 46 additions & 1 deletion

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Unique identifier added to `RendererBase` classes
2+
`````````````````````````````````````````````````
3+
4+
Since ``id()`` is not guaranteed to be unique between objects that exist at
5+
different times, a new private property ``_uid`` has been added to
6+
`RendererBase` which is used along with the renderer's ``id()`` to cache
7+
certain expensive operations.
8+
9+
If a custom renderer does not subclass `RendererBase` or `MixedModeRenderer`,
10+
it is not required to implement this ``_uid`` property, but this may produce
11+
incorrect behavior when the renderers' ``id()`` clashes.

lib/matplotlib/backend_bases.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@
100100
}
101101

102102

103+
# Used to ensure that caching based on renderer id() is unique without being as
104+
# expensive as a real UUID.
105+
_unique_renderer_id = 0
106+
107+
103108
def register_backend(format, backend, description=None):
104109
"""
105110
Register a backend for saving to a given file format.
@@ -212,10 +217,25 @@ class RendererBase(object):
212217
213218
"""
214219
def __init__(self):
220+
self._id = None
215221
self._texmanager = None
216222

217223
self._text2path = textpath.TextToPath()
218224

225+
@property
226+
def _uid(self):
227+
"""
228+
A lightweight id for unique-ification purposes.
229+
230+
Along with id(self), this combination should be unique enough to use as
231+
part of a caching key.
232+
"""
233+
if self._id is None:
234+
global _unique_renderer_id
235+
_unique_renderer_id += 1
236+
self._id = _unique_renderer_id
237+
return self._id
238+
219239
def open_group(self, s, gid=None):
220240
"""
221241
Open a grouping element with label *s*. If *gid* is given, use

lib/matplotlib/backends/backend_mixed.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer,
4949
if raster_renderer_class is None:
5050
raster_renderer_class = RendererAgg
5151

52+
self._id = None
5253
self._raster_renderer_class = raster_renderer_class
5354
self._width = width
5455
self._height = height
@@ -80,6 +81,18 @@ def __init__(self, figure, width, height, dpi, vector_renderer,
8081
_text2path _get_text_path_transform height width
8182
""".split()
8283

84+
@property
85+
def _uid(self):
86+
"""
87+
See matplotlib.backend_bases.RendererBase._uid.
88+
"""
89+
if self._id is None:
90+
from matplotlib import backend_bases
91+
backend_bases._unique_renderer_id
92+
backend_bases._unique_renderer_id += 1
93+
self._id = backend_bases._unique_renderer_id
94+
return self._id
95+
8396
def _set_current_renderer(self, renderer):
8497
self._renderer = renderer
8598

lib/matplotlib/text.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -907,11 +907,12 @@ def get_prop_tup(self, renderer=None):
907907
need to know if the text has changed.
908908
"""
909909
x, y = self.get_unitless_position()
910+
renderer = renderer or self._renderer
910911
return (x, y, self.get_text(), self._color,
911912
self._verticalalignment, self._horizontalalignment,
912913
hash(self._fontproperties),
913914
self._rotation, self._rotation_mode,
914-
self.figure.dpi, id(renderer or self._renderer),
915+
self.figure.dpi, id(renderer), getattr(renderer, '_uid', 0),
915916
self._linespacing
916917
)
917918

0 commit comments

Comments
 (0)