Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdbd5db6

Browse files
committed
setattr context manager.
1 parent3d3472c commitdbd5db6

File tree

12 files changed

+147
-194
lines changed

12 files changed

+147
-194
lines changed

‎lib/matplotlib/artist.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -897,13 +897,8 @@ def _update_property(self, k, v):
897897
raiseAttributeError('Unknown property %s'%k)
898898
returnfunc(v)
899899

900-
store=self.eventson
901-
self.eventson=False
902-
try:
903-
ret= [_update_property(self,k,v)
904-
fork,vinprops.items()]
905-
finally:
906-
self.eventson=store
900+
withcbook._setattr_cm(self,eventson=False):
901+
ret= [_update_property(self,k,v)fork,vinprops.items()]
907902

908903
iflen(ret):
909904
self.pchanged()

‎lib/matplotlib/backend_bases.py

Lines changed: 99 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -2148,17 +2148,6 @@ def print_figure(self, filename, dpi=None, facecolor=None, edgecolor=None,
21482148
tight bbox is calculated.
21492149
21502150
"""
2151-
self._is_saving=True
2152-
# Remove the figure manager, if any, to avoid resizing the GUI widget.
2153-
# Having *no* manager and a *None* manager are currently different (see
2154-
# Figure.show); should probably be normalized to None at some point.
2155-
_no_manager=object()
2156-
ifhasattr(self,'manager'):
2157-
manager=self.manager
2158-
delself.manager
2159-
else:
2160-
manager=_no_manager
2161-
21622151
ifformatisNone:
21632152
# get format from filename, or from backend's default filetype
21642153
ifisinstance(filename,six.string_types):
@@ -2175,111 +2164,114 @@ def print_figure(self, filename, dpi=None, facecolor=None, edgecolor=None,
21752164

21762165
ifdpiisNone:
21772166
dpi=rcParams['savefig.dpi']
2178-
21792167
ifdpi=='figure':
21802168
dpi=getattr(self.figure,'_original_dpi',self.figure.dpi)
21812169

2182-
iffacecolorisNone:
2183-
facecolor=rcParams['savefig.facecolor']
2184-
ifedgecolorisNone:
2185-
edgecolor=rcParams['savefig.edgecolor']
2186-
2187-
origDPI=self.figure.dpi
2188-
origfacecolor=self.figure.get_facecolor()
2189-
origedgecolor=self.figure.get_edgecolor()
2190-
2191-
self.figure.dpi=dpi
2192-
self.figure.set_facecolor(facecolor)
2193-
self.figure.set_edgecolor(edgecolor)
2194-
2195-
bbox_inches=kwargs.pop("bbox_inches",None)
2196-
ifbbox_inchesisNone:
2197-
bbox_inches=rcParams['savefig.bbox']
2198-
2199-
ifbbox_inches:
2200-
# call adjust_bbox to save only the given area
2201-
ifbbox_inches=="tight":
2202-
# when bbox_inches == "tight", it saves the figure
2203-
# twice. The first save command is just to estimate
2204-
# the bounding box of the figure. A stringIO object is
2205-
# used as a temporary file object, but it causes a
2206-
# problem for some backends (ps backend with
2207-
# usetex=True) if they expect a filename, not a
2208-
# file-like object. As I think it is best to change
2209-
# the backend to support file-like object, i'm going
2210-
# to leave it as it is. However, a better solution
2211-
# than stringIO seems to be needed. -JJL
2170+
# Remove the figure manager, if any, to avoid resizing the GUI widget.
2171+
# Some code (e.g. Figure.show) differentiates between having *no*
2172+
# manager and a *None* manager, which should be fixed at some point,
2173+
# but this should be fine.
2174+
withcbook._setattr_cm(self,_is_saving=True,manager=None), \
2175+
cbook._setattr_cm(self.figure,dpi=dpi):
2176+
2177+
iffacecolorisNone:
2178+
facecolor=rcParams['savefig.facecolor']
2179+
ifedgecolorisNone:
2180+
edgecolor=rcParams['savefig.edgecolor']
2181+
2182+
origfacecolor=self.figure.get_facecolor()
2183+
origedgecolor=self.figure.get_edgecolor()
2184+
2185+
self.figure.dpi=dpi
2186+
self.figure.set_facecolor(facecolor)
2187+
self.figure.set_edgecolor(edgecolor)
2188+
2189+
bbox_inches=kwargs.pop("bbox_inches",None)
2190+
ifbbox_inchesisNone:
2191+
bbox_inches=rcParams['savefig.bbox']
2192+
2193+
ifbbox_inches:
2194+
# call adjust_bbox to save only the given area
2195+
ifbbox_inches=="tight":
2196+
# when bbox_inches == "tight", it saves the figure
2197+
# twice. The first save command is just to estimate
2198+
# the bounding box of the figure. A stringIO object is
2199+
# used as a temporary file object, but it causes a
2200+
# problem for some backends (ps backend with
2201+
# usetex=True) if they expect a filename, not a
2202+
# file-like object. As I think it is best to change
2203+
# the backend to support file-like object, i'm going
2204+
# to leave it as it is. However, a better solution
2205+
# than stringIO seems to be needed. -JJL
2206+
result=print_method(
2207+
io.BytesIO(),
2208+
dpi=dpi,
2209+
facecolor=facecolor,
2210+
edgecolor=edgecolor,
2211+
orientation=orientation,
2212+
dryrun=True,
2213+
**kwargs)
2214+
renderer=self.figure._cachedRenderer
2215+
bbox_inches=self.figure.get_tightbbox(renderer)
2216+
2217+
bbox_artists=kwargs.pop("bbox_extra_artists",None)
2218+
ifbbox_artistsisNone:
2219+
bbox_artists= \
2220+
self.figure.get_default_bbox_extra_artists()
2221+
2222+
bbox_filtered= []
2223+
forainbbox_artists:
2224+
bbox=a.get_window_extent(renderer)
2225+
ifa.get_clip_on():
2226+
clip_box=a.get_clip_box()
2227+
ifclip_boxisnotNone:
2228+
bbox=Bbox.intersection(bbox,clip_box)
2229+
clip_path=a.get_clip_path()
2230+
ifclip_pathisnotNoneandbboxisnotNone:
2231+
clip_path= \
2232+
clip_path.get_fully_transformed_path()
2233+
bbox=Bbox.intersection(
2234+
bbox,clip_path.get_extents())
2235+
ifbboxisnotNoneand (
2236+
bbox.width!=0orbbox.height!=0):
2237+
bbox_filtered.append(bbox)
2238+
2239+
ifbbox_filtered:
2240+
_bbox=Bbox.union(bbox_filtered)
2241+
trans=Affine2D().scale(1.0/self.figure.dpi)
2242+
bbox_extra=TransformedBbox(_bbox,trans)
2243+
bbox_inches=Bbox.union([bbox_inches,bbox_extra])
2244+
2245+
pad=kwargs.pop("pad_inches",None)
2246+
ifpadisNone:
2247+
pad=rcParams['savefig.pad_inches']
2248+
2249+
bbox_inches=bbox_inches.padded(pad)
2250+
2251+
restore_bbox=tight_bbox.adjust_bbox(self.figure,bbox_inches,
2252+
canvas.fixed_dpi)
2253+
2254+
_bbox_inches_restore= (bbox_inches,restore_bbox)
2255+
else:
2256+
_bbox_inches_restore=None
2257+
2258+
try:
22122259
result=print_method(
2213-
io.BytesIO(),
2260+
filename,
22142261
dpi=dpi,
22152262
facecolor=facecolor,
22162263
edgecolor=edgecolor,
22172264
orientation=orientation,
2218-
dryrun=True,
2265+
bbox_inches_restore=_bbox_inches_restore,
22192266
**kwargs)
2220-
renderer=self.figure._cachedRenderer
2221-
bbox_inches=self.figure.get_tightbbox(renderer)
2222-
2223-
bbox_artists=kwargs.pop("bbox_extra_artists",None)
2224-
ifbbox_artistsisNone:
2225-
bbox_artists=self.figure.get_default_bbox_extra_artists()
2226-
2227-
bbox_filtered= []
2228-
forainbbox_artists:
2229-
bbox=a.get_window_extent(renderer)
2230-
ifa.get_clip_on():
2231-
clip_box=a.get_clip_box()
2232-
ifclip_boxisnotNone:
2233-
bbox=Bbox.intersection(bbox,clip_box)
2234-
clip_path=a.get_clip_path()
2235-
ifclip_pathisnotNoneandbboxisnotNone:
2236-
clip_path=clip_path.get_fully_transformed_path()
2237-
bbox=Bbox.intersection(bbox,
2238-
clip_path.get_extents())
2239-
ifbboxisnotNoneand (bbox.width!=0or
2240-
bbox.height!=0):
2241-
bbox_filtered.append(bbox)
2242-
2243-
ifbbox_filtered:
2244-
_bbox=Bbox.union(bbox_filtered)
2245-
trans=Affine2D().scale(1.0/self.figure.dpi)
2246-
bbox_extra=TransformedBbox(_bbox,trans)
2247-
bbox_inches=Bbox.union([bbox_inches,bbox_extra])
2248-
2249-
pad=kwargs.pop("pad_inches",None)
2250-
ifpadisNone:
2251-
pad=rcParams['savefig.pad_inches']
2252-
2253-
bbox_inches=bbox_inches.padded(pad)
2254-
2255-
restore_bbox=tight_bbox.adjust_bbox(self.figure,bbox_inches,
2256-
canvas.fixed_dpi)
2257-
2258-
_bbox_inches_restore= (bbox_inches,restore_bbox)
2259-
else:
2260-
_bbox_inches_restore=None
2261-
2262-
try:
2263-
result=print_method(
2264-
filename,
2265-
dpi=dpi,
2266-
facecolor=facecolor,
2267-
edgecolor=edgecolor,
2268-
orientation=orientation,
2269-
bbox_inches_restore=_bbox_inches_restore,
2270-
**kwargs)
2271-
finally:
2272-
ifbbox_inchesandrestore_bbox:
2273-
restore_bbox()
2274-
2275-
self.figure.dpi=origDPI
2276-
self.figure.set_facecolor(origfacecolor)
2277-
self.figure.set_edgecolor(origedgecolor)
2278-
self.figure.set_canvas(self)
2279-
ifmanagerisnot_no_manager:
2280-
self.manager=manager
2281-
self._is_saving=False
2282-
returnresult
2267+
finally:
2268+
ifbbox_inchesandrestore_bbox:
2269+
restore_bbox()
2270+
2271+
self.figure.set_facecolor(origfacecolor)
2272+
self.figure.set_edgecolor(origedgecolor)
2273+
self.figure.set_canvas(self)
2274+
returnresult
22832275

22842276
@classmethod
22852277
defget_default_filetype(cls):

‎lib/matplotlib/backends/backend_agg.py

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -489,53 +489,33 @@ def buffer_rgba(self):
489489
defprint_raw(self,filename_or_obj,*args,**kwargs):
490490
FigureCanvasAgg.draw(self)
491491
renderer=self.get_renderer()
492-
original_dpi=renderer.dpi
493-
renderer.dpi=self.figure.dpi
494-
ifisinstance(filename_or_obj,six.string_types):
495-
fileobj=open(filename_or_obj,'wb')
496-
close=True
497-
else:
498-
fileobj=filename_or_obj
499-
close=False
500-
try:
501-
fileobj.write(renderer._renderer.buffer_rgba())
502-
finally:
503-
ifclose:
504-
fileobj.close()
505-
renderer.dpi=original_dpi
492+
withcbook._setattr_cm(renderer,dpi=self.figure.dpi), \
493+
cbook.open_file_cm(filename_or_obj,"wb")asfh:
494+
fh.write(renderer._renderer.buffer_rgba())
506495
print_rgba=print_raw
507496

508497
defprint_png(self,filename_or_obj,*args,**kwargs):
509498
FigureCanvasAgg.draw(self)
510499
renderer=self.get_renderer()
511-
original_dpi=renderer.dpi
512-
renderer.dpi=self.figure.dpi
513500

514-
version_str='matplotlib version '+__version__+ \
515-
', http://matplotlib.org/'
501+
version_str=(
502+
'matplotlib version '+__version__+', http://matplotlib.org/')
516503
metadata=OrderedDict({'Software':version_str})
517504
user_metadata=kwargs.pop("metadata",None)
518505
ifuser_metadataisnotNone:
519506
metadata.update(user_metadata)
520507

521-
try:
522-
withcbook.open_file_cm(filename_or_obj,"wb")asfh:
523-
_png.write_png(renderer._renderer,fh,
524-
self.figure.dpi,metadata=metadata)
525-
finally:
526-
renderer.dpi=original_dpi
508+
withcbook._setattr_cm(renderer,dpi=self.figure.dpi), \
509+
cbook.open_file_cm(filename_or_obj,"wb")asfh:
510+
_png.write_png(renderer._renderer,fh,
511+
self.figure.dpi,metadata=metadata)
527512

528513
defprint_to_buffer(self):
529514
FigureCanvasAgg.draw(self)
530515
renderer=self.get_renderer()
531-
original_dpi=renderer.dpi
532-
renderer.dpi=self.figure.dpi
533-
try:
534-
result= (renderer._renderer.buffer_rgba(),
535-
(int(renderer.width),int(renderer.height)))
536-
finally:
537-
renderer.dpi=original_dpi
538-
returnresult
516+
withcbook._setattr_cm(renderer,dpi=self.figure.dpi):
517+
return (renderer._renderer.buffer_rgba(),
518+
(int(renderer.width),int(renderer.height)))
539519

540520
if_has_pil:
541521
# add JPEG support

‎lib/matplotlib/backends/backend_qt5.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,9 @@ def cooperative_qwidget_init(self, *args, **kwargs):
166166

167167
@functools.wraps(__init__)
168168
defwrapper(self,**kwargs):
169-
try:
170-
QtWidgets.QWidget.__init__=cooperative_qwidget_init
169+
withcbook._setattr_cm(QtWidgets.QWidget,
170+
__init__=cooperative_qwidget_init):
171171
__init__(self,**kwargs)
172-
finally:
173-
# Restore __init__
174-
QtWidgets.QWidget.__init__=qwidget_init
175172

176173
returnwrapper
177174

‎lib/matplotlib/backends/backend_qt5agg.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,8 @@ def draw(self):
127127
# uses the result of the draw() to update plot elements.
128128
ifself._agg_is_drawing:
129129
return
130-
131-
self._agg_is_drawing=True
132-
try:
130+
withcbook._setattr_cm(self,_agg_is_drawing=True):
133131
super(FigureCanvasQTAggBase,self).draw()
134-
finally:
135-
self._agg_is_drawing=False
136132
self.update()
137133

138134
defdraw_idle(self):

‎lib/matplotlib/backends/backend_webagg_core.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,11 @@ def show(self):
151151

152152
defdraw(self):
153153
renderer=self.get_renderer(cleared=True)
154-
155154
self._png_is_old=True
156-
157-
backend_agg.RendererAgg.lock.acquire()
158155
try:
159-
self.figure.draw(renderer)
156+
withbackend_agg.RendererAgg.lock:
157+
self.figure.draw(renderer)
160158
finally:
161-
backend_agg.RendererAgg.lock.release()
162159
# Swap the frames
163160
self.manager.refresh_all()
164161

‎lib/matplotlib/cbook/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2803,3 +2803,21 @@ def _str_lower_equal(obj, s):
28032803
cannot be used in a boolean context.
28042804
"""
28052805
returnisinstance(obj,six.string_types)andobj.lower()==s
2806+
2807+
2808+
@contextlib.contextmanager
2809+
def_setattr_cm(obj,**kwargs):
2810+
"""Temporarily set some attributes; restore original state at context exit.
2811+
"""
2812+
sentinel=object()
2813+
origs= [(attr,getattr(obj,attr,sentinel))forattrinkwargs]
2814+
try:
2815+
forattr,valinkwargs.items():
2816+
setattr(obj,attr,val)
2817+
yield
2818+
finally:
2819+
forattr,originorigs:
2820+
iforigissentinel:
2821+
delattr(obj,attr)
2822+
else:
2823+
setattr(obj,attr,orig)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp