@@ -1189,49 +1189,64 @@ class FigureCanvasSVG(FigureCanvasBase):
1189
1189
1190
1190
def print_svg (self , filename , * args , ** kwargs ):
1191
1191
if is_string_like (filename ):
1192
- fh_to_close = svgwriter = io .open (filename , 'w' , encoding = 'utf-8' )
1193
- elif is_writable_file_like (filename ):
1194
- if not isinstance (filename , io .TextIOBase ):
1195
- if six .PY3 :
1196
- svgwriter = io .TextIOWrapper (filename , 'utf-8' )
1197
- else :
1198
- svgwriter = codecs .getwriter ('utf-8' )(filename )
1192
+ with io .open (filename , 'w' , encoding = 'utf-8' ) as svgwriter :
1193
+ return self ._print_svg (filename , svgwriter , ** kwargs )
1194
+
1195
+ if not is_writable_file_like (filename ):
1196
+ raise ValueError ("filename must be a path or a file-like object" )
1197
+
1198
+ svgwriter = filename
1199
+ filename = getattr (svgwriter , 'name' , '' )
1200
+ if not isinstance (filename , six .string_types ):
1201
+ filename = ''
1202
+
1203
+ if not isinstance (svgwriter , io .TextIOBase ):
1204
+ if six .PY3 :
1205
+ svgwriter = io .TextIOWrapper (svgwriter , 'utf-8' )
1199
1206
else :
1200
- svgwriter = filename
1201
- fh_to_close = None
1207
+ svgwriter = codecs . getwriter ( 'utf-8' )( svgwriter )
1208
+ detach = True
1202
1209
else :
1203
- raise ValueError ("filename must be a path or a file-like object" )
1204
- return self ._print_svg (filename , svgwriter , fh_to_close , ** kwargs )
1210
+ detach = False
1211
+
1212
+ result = self ._print_svg (filename , svgwriter , ** kwargs )
1213
+
1214
+ # Detach underlying stream from wrapper so that it remains open in the
1215
+ # caller.
1216
+ if detach :
1217
+ if six .PY3 :
1218
+ svgwriter .detach ()
1219
+ else :
1220
+ svgwriter .reset ()
1221
+ svgwriter .stream = io .BytesIO ()
1222
+
1223
+ return result
1205
1224
1206
1225
def print_svgz (self , filename , * args , ** kwargs ):
1207
1226
if is_string_like (filename ):
1208
- fh_to_close = gzipwriter = gzip .GzipFile (filename , 'w' )
1209
- svgwriter = io .TextIOWrapper (gzipwriter , 'utf-8' )
1227
+ options = dict (filename = filename )
1210
1228
elif is_writable_file_like (filename ):
1211
- fh_to_close = gzipwriter = gzip .GzipFile (fileobj = filename , mode = 'w' )
1212
- svgwriter = io .TextIOWrapper (gzipwriter , 'utf-8' )
1229
+ options = dict (fileobj = filename )
1213
1230
else :
1214
1231
raise ValueError ("filename must be a path or a file-like object" )
1215
- return self ._print_svg (filename , svgwriter , fh_to_close )
1216
-
1217
- def _print_svg (self , filename , svgwriter , fh_to_close = None , ** kwargs ):
1218
- try :
1219
- image_dpi = kwargs .pop ("dpi" , 72 )
1220
- self .figure .set_dpi (72.0 )
1221
- width , height = self .figure .get_size_inches ()
1222
- w , h = width * 72 , height * 72
1223
-
1224
- _bbox_inches_restore = kwargs .pop ("bbox_inches_restore" , None )
1225
- renderer = MixedModeRenderer (
1226
- self .figure ,
1227
- width , height , image_dpi , RendererSVG (w , h , svgwriter , filename , image_dpi ),
1228
- bbox_inches_restore = _bbox_inches_restore )
1229
-
1230
- self .figure .draw (renderer )
1231
- renderer .finalize ()
1232
- finally :
1233
- if fh_to_close is not None :
1234
- svgwriter .close ()
1232
+
1233
+ with gzip .GzipFile (mode = 'w' , ** options ) as gzipwriter :
1234
+ return self .print_svg (gzipwriter )
1235
+
1236
+ def _print_svg (self , filename , svgwriter , ** kwargs ):
1237
+ image_dpi = kwargs .pop ("dpi" , 72 )
1238
+ self .figure .set_dpi (72.0 )
1239
+ width , height = self .figure .get_size_inches ()
1240
+ w , h = width * 72 , height * 72
1241
+
1242
+ _bbox_inches_restore = kwargs .pop ("bbox_inches_restore" , None )
9E81
1243
+ renderer = MixedModeRenderer (
1244
+ self .figure ,
1245
+ width , height , image_dpi , RendererSVG (w , h , svgwriter , filename , image_dpi ),
1246
+ bbox_inches_restore = _bbox_inches_restore )
1247
+
1248
+ self .figure .draw (renderer )
1249
+ renderer .finalize ()
1235
1250
1236
1251
def get_default_filetype (self ):
1237
1252
return 'svg'
0 commit comments