@@ -437,11 +437,19 @@ class _TemporaryFileCloser:
437
437
cleanup_called = False
438
438
close_called = False
439
439
440
- def __init__ (self , file , name , delete = True , delete_on_close = True ):
440
+ def __init__ (
441
+ self ,
442
+ file ,
443
+ name ,
444
+ delete = True ,
445
+ delete_on_close = True ,
446
+ warn_message = "Implicitly cleaning up unknown file" ,
447
+ ):
441
448
self .file = file
442
449
self .name = name
443
450
self .delete = delete
444
451
self .delete_on_close = delete_on_close
452
+ self .warn_message = warn_message
445
453
446
454
def cleanup (self , windows = (_os .name == 'nt' ), unlink = _os .unlink ):
447
455
if not self .cleanup_called :
@@ -469,7 +477,10 @@ def close(self):
469
477
self .cleanup ()
470
478
471
479
def __del__ (self ):
480
+ close_called = self .close_called
472
481
self .cleanup ()
482
+ if not close_called :
483
+ _warnings .warn (self .warn_message , ResourceWarning )
473
484
474
485
475
486
class _TemporaryFileWrapper :
@@ -483,8 +494,17 @@ class _TemporaryFileWrapper:
483
494
def __init__ (self , file , name , delete = True , delete_on_close = True ):
484
495
self .file = file
485
496
self .name = name
486
- self ._closer = _TemporaryFileCloser (file , name , delete ,
487
- delete_on_close )
497
+ self ._closer = _TemporaryFileCloser (
498
+ file ,
499
+ name ,
500
+ delete ,
501
+ delete_on_close ,
502
+ warn_message = "Implicitly cleaning up {self!r}" ,
503
+ )
504
+
505
+ def __repr__ (self ):
506
+ file = self .__dict__ ['file' ]
507
+ return f"<{ type (self ).__name__ } { file = } >"
488
508
489
509
def __getattr__ (self , name ):
490
510
# Attribute lookups are delegated to the underlying file
0 commit comments