Message226537
The functions inspect.getsource() and inspect.getsourcelines() return inconsistent results for frames corresponding to class definitions within a function.
Test code:
import sys
import inspect
def case1():
class C:
def __init__(self):
pass
c = C()
def case2():
a = 1
class C:
def __init__(self):
pass
c = C()
def case3():
def fn():
pass
class C:
def __init__(self):
pass
c = C()
def trace(frame,event,arg):
code = frame.f_code
print('name:',code.co_name)
print('source:\n',inspect.getsource(code),'\n')
for case in ('case1','case2','case3'):
print('#####',case)
call = getattr(sys.modules[__name__],case)
sys.settrace(trace)
try:
call()
finally:
sys.settrace(None)
Result:
##### case1
name: case1
source:
def case1():
class C:
def __init__(self):
pass
c = C()
name: C
source:
def case1():
class C:
def __init__(self):
pass
c = C()
name: __init__
source:
def __init__(self):
pass
##### case2
name: case2
source:
def case2():
a = 1
class C:
def __init__(self):
pass
c = C()
name: C
source:
def case2():
a = 1
class C:
def __init__(self):
pass
c = C()
name: __init__
source:
def __init__(self):
pass
##### case3
name: case3
source:
def case3():
def fn():
pass
class C:
def __init__(self):
pass
c = C()
name: C
source:
def fn():
pass
name: __init__
source:
def __init__(self):
pass
The source listed for frames named 'C' (the class creation code) is not consistent across all three cases. It could be considered incorrect in all cases as it does not correspond only to the class definition source lines. |
|
Date |
User |
Action |
Args |
2014-09-07 14:45:41 | isedev | set | recipients:
+ isedev |
2014-09-07 14:45:41 | isedev | set | messageid: <1410101141.24.0.25482778458.issue22355@psf.upfronthosting.co.za> |
2014-09-07 14:45:41 | isedev | link | issue22355 messages |
2014-09-07 14:45:40 | isedev | create | |
|