On Sun, Jul 24, 2011 at 3:05 PM, Eric Snow <ericsnowcurren...@gmail.com> wrote:
> Are there other objects in the interpreter state that are exposed in
> sys that would have the same problem?

Rebinding (rather than mutating) any global state in any module is
always dubious due to the potential for direct references to the
previous value. (This is a large part of the reason why imp.reload()
often doesn't work in practice)

sys.modules, sys.path, sys.argv, sys.stdout, et al are all subject to
that caveat. For mutable state, the onus is typically on the developer
performing the substitution to decide whether or not those
consequences are acceptable (usually, they're not, hence you get
idioms like "sys.path[:] = saved_copy" to revert sys.path to a saved
value). For immutable state (such as sys.stdout), where modification
in place isn't possible, the obligation often goes the other way, with
developers deliberately avoiding cached references in order to
correctly react to runtime changes.

sys.modules is by far the worst case though, since dropping modules
out of that cache is only safe for modules that correctly support
imp.reload(). This is not the case for any module that mutates other
global state (or is otherwise referenced from other modules), nor does
it work properly for extension modules.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncogh...@gmail.com   |   Brisbane, Australia
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to