Terry J. Reedy <[email protected]> added the comment:
Do we really need to say that getsource(object) can only get the object's
source if it is accessible from the object? Getsource also fails if a module
is loaded from a .pyc with not corresponding .py available.
The problem is not the call being in __main__. When I put the three lines
(with the 3rd wrapped with print()) in an IDLE editor and run, and re-inspect,
I get
======================== RESTART: F:\Python\a\tem3.py ========================
class A:
pass
>>> inspect.getsource(A)
'class A:\n pass\n'
Ditto if I run > py -i -m a.tem3
If I continue in IDLE's Shell
>>> class B: pass
>>> inspect.getsource(B)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
inspect.getsource(B)
File "F:\dev\37\lib\inspect.py", line 973, in getsource
lines, lnum = getsourcelines(object)
File "F:\dev\37\lib\inspect.py", line 955, in getsourcelines
lines, lnum = findsource(object)
File "F:\dev\37\lib\inspect.py", line 812, in findsource
raise OSError('could not find class definition')
OSError: could not find class definition
If I enter the three lines above in a fress python or IDLEs shell, I get the
TypeError above.
IDLE does store interactive inputs into linecache, so that tracebacks contain
the offending line (unlike interactive python). But it does so on a statement
by statement basis, so that each entry is treated as a separate file. In a
traceback for an exception in a multiline statement, the line number is
relative to the statement.
>>> def f():
# line2 of f
1/0
>>> f()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
f()
File "<pyshell#12>", line 3, in f
1/0
ZeroDivisionError: division by zero
Interactive python displays '<stdin>' as the file for all entries. IDLE
numbers them, so previous statements remained cached. I consider enhanced
interactive tracebacks to be an important feature.
But I don't see how to attach individual pseudofile names to classes and
functions so that getsource could find their source lines.
----------
nosy: +terry.reedy
versions: +Python 3.7, Python 3.8 -Python 2.7, Python 3.4, Python 3.5, Python
3.6
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue12920>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com