From 709b4c35cc6e6f5db58d9e440b5ca732b7fdb6a2 Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Thu, 11 Feb 2010 00:25:17 +0000 Subject: [PATCH] Merged revisions 78139 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r78139 | r.david.murray | 2010-02-10 19:15:05 -0500 (Wed, 10 Feb 2010) | 15 lines Merged revisions 78137 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78137 | r.david.murray | 2010-02-10 17:42:04 -0500 (Wed, 10 Feb 2010) | 8 lines Issue 7835: Shelve's __del__ method calls its close method, and its close method refers to an identifier in the global module namespace. This means that when __del__ is called during interpreter shutdown (if, for example, the calling program still has a pointer to the shelf), sometimes that global identifier would wind up being None, causing mysterious 'ignored' exceptions. This patch checks for the possible None value first before using the global, thus avoiding the error messages. ........ ................ --- Lib/shelve.py | 6 +++++- Misc/NEWS | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/shelve.py b/Lib/shelve.py index fb2fa93b01..8271dfeddc 100644 --- a/Lib/shelve.py +++ b/Lib/shelve.py @@ -136,7 +136,11 @@ class Shelf(collections.MutableMapping): self.dict.close() except AttributeError: pass - self.dict = _ClosedDict() + # _ClosedDict can be None when close is called from __del__ during shutdown + if _ClosedDict is None: + self.dict = None + else: + self.dict = _ClosedDict() def __del__(self): if not hasattr(self, 'writeback'): diff --git a/Misc/NEWS b/Misc/NEWS index c5b971d3ad..054bb3d0b4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -79,6 +79,9 @@ Core and Builtins Library ------- +- Issue #7835: shelve should no longer produce mysterious warnings during + interpreter shutdown. + - Issue #6233: ElementTree failed converting unicode characters to XML entities when they could't be represented in the requested output encoding. Patch by Jerry Chen. -- 2.40.0