classification
Title: inspect.getsource doesn't update when a module is reloaded
Type: behavior Stage: patch review
Components: Library (Lib) Versions: Python 3.4, Python 3.3, Python 3.2, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: BreamoreBoy, ajaksu2, berker.peksag, exarkun, georg.brandl, gpolo, sonderblade
Priority: normal Keywords: patch

Created on 2005-06-10 13:49 by sonderblade, last changed 2012-12-10 08:01 by berker.peksag.

Files
File name Uploaded Description Edit
inspect.py.diff gpolo, 2008-02-07 19:42 review
test_inspect-trunk.diff ajaksu2, 2009-04-25 19:38 Test source reloading with inspect.getsource review
test_inspect-py3k2.diff ajaksu2, 2009-04-25 20:08 Test source reloading with inspect.getsource in py3k review
issue1218234.diff berker.peksag, 2012-12-10 08:00 review
Messages (8)
msg60756 - (view) Author: Björn Lindqvist (sonderblade) Date: 2005-06-10 13:49
This is test.py:

def foo():
    print "Bla"

And in an interactive session:

>>> import inspect, test
>>> test.foo()
Bla
>>> inspect.getsource(test.foo)
'def foo():\n    print "Bla"\n'

Now I edit test.py to (without exiting the interactive
session):

def foo():
    print "Oh no!"

>>> reload(test)
<module 'test' from 'test.py'>
>>> test.foo()
Oh no!
>>> inspect.getsource(test.foo)
'def foo():\n    print "Bla"\n'

inspect should output the new source.
msg60757 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2005-06-10 16:36
Logged In: YES 
user_id=1188172

This is the fault of the linecache module which inspect
uses. It caches the file contents and does not reload it
accordingly. However, I assume it's pretty hard finding a
good solution to this.
msg62174 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2008-02-07 19:42
I'm attaching a patch. Is there some hidden problem that it may cause ?
By the way, this issue is a duplicate of http://bugs.python.org/issue993580
msg86540 - (view) Author: Daniel Diniz (ajaksu2) Date: 2009-04-25 19:38
Fix was committed to py3k but with no tests AFAIK. Here's a (failing)
test for trunk that runs OK after Guilherme's patch.

We might want to keep this behavior restricted for when the module was
reloaded.
msg86544 - (view) Author: Daniel Diniz (ajaksu2) Date: 2009-04-25 20:08
Er, no, it wasn't committed to py3k, it was just me getting my patches
mixed. Attaching the py3k test with relative import fixed.
msg110435 - (view) Author: Mark Lawrence (BreamoreBoy) Date: 2010-07-16 13:23
The change to inspect.py is two lines.  Given that unit test patches are also supplied could someone with the knowledge give yes or no to accepting this patch?
msg110436 - (view) Author: Jean-Paul Calderone (exarkun) * (Python committer) Date: 2010-07-16 13:27
Calling linecache.checkcache for every inspect.getsource call sounds like a fairly bad idea to me.

linecache.checkcache does a stat() of every single cached file.
msg110438 - (view) Author: Jean-Paul Calderone (exarkun) * (Python committer) Date: 2010-07-16 13:31
> linecache.checkcache does a stat() of every single cached file.

Ah, sorry.  I didn't read carefully enough.  I see that the patch passes in the filename and checkcache restricts the work it does in that case.

Something else to consider, though, is that this change means you'll also get the new source if you *don't* reload the module, too.  So, what exactly is inspect.getsource() supposed to be doing?  Giving you the current on-disk contents of the relevant source file?  Or giving you the actual source corresponding to the object passed to it?

If the latter, then this actually needs to be more tightly integrated with module reloading somehow.
History
Date User Action Args
2012-12-10 08:01:48berker.peksagsetnosy: + berker.peksag
2012-12-10 08:00:46berker.peksagsetfiles: + issue1218234.diff
versions: + Python 3.3, Python 3.4, - Python 3.1
2010-07-16 13:31:59exarkunsetmessages: + msg110438
2010-07-16 13:27:42exarkunsetnosy: + exarkun
messages: + msg110436
2010-07-16 13:23:06BreamoreBoysetnosy: + BreamoreBoy

messages: + msg110435
versions: + Python 3.1, Python 2.7, Python 3.2, - Python 2.6, Python 3.0
2009-04-25 20:08:18ajaksu2setfiles: - test_inspect-py3k.diff
2009-04-25 20:08:09ajaksu2setfiles: + test_inspect-py3k2.diff

messages: + msg86544
2009-04-25 19:39:15ajaksu2setfiles: + test_inspect-py3k.diff
2009-04-25 19:38:32ajaksu2setfiles: + test_inspect-trunk.diff

type: behavior
versions: + Python 2.6, Python 3.0, - Python 2.5
keywords: + patch
nosy: + ajaksu2

messages: + msg86540
stage: patch review
2009-04-05 18:16:38georg.brandllinkissue993580 superseder
2009-04-05 18:16:38georg.brandlunlinkissue993580 dependencies
2009-03-04 15:13:21ajaksu2linkissue993580 dependencies
2008-02-07 19:42:24gpolosetfiles: + inspect.py.diff
nosy: + gpolo
messages: + msg62174
2005-06-10 13:49:10sonderbladecreate