(original) (raw)
changeset: 84057:d6ad9d7468f7 user: Richard Oudkerk shibturn@gmail.com date: Sat Jun 08 16:52:29 2013 +0100 files: Lib/weakref.py description: Issue #15528: Delay importing atexit until weakref.finalize() used. diff -r 0be613638523 -r d6ad9d7468f7 Lib/weakref.py --- a/Lib/weakref.py Sat Jun 08 00:35:51 2013 -0400 +++ b/Lib/weakref.py Sat Jun 08 16:52:29 2013 +0100 @@ -23,7 +23,6 @@ import collections # Import after _weakref to avoid circular import. import sys import itertools -import atexit ProxyTypes = (ProxyType, CallableProxyType) @@ -464,11 +463,18 @@ _shutdown = False _index_iter = itertools.count() _dirty = False + _registered_with_atexit = False class _Info: __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") def __init__(self, obj, func, *args, **kwargs): + if not self._registered_with_atexit: + # We may register the exit function more than once because + # of a thread race, but that is harmless + import atexit + atexit.register(self._exitfunc) + finalize._registered_with_atexit = True info = self._Info() info.weakref = ref(obj, self) info.func = func @@ -569,5 +575,3 @@ finalize._shutdown = True if reenable_gc: gc.enable() - -atexit.register(finalize._exitfunc) /shibturn@gmail.com