[New-bugs-announce] [issue22355] inconsistent results with inspect.getsource() / inspect.getsourcelines()

Iestyn Elfick report at bugs.python.org
Sun Sep 7 16:45:41 CEST 2014


New submission from Iestyn Elfick:

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.

----------
components: Library (Lib)
messages: 226537
nosy: isedev
priority: normal
severity: normal
status: open
title: inconsistent results with inspect.getsource() / inspect.getsourcelines()
type: behavior
versions: Python 3.3

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue22355>
_______________________________________


More information about the New-bugs-announce mailing list