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 <rep...@bugs.python.org>
<http://bugs.python.org/issue22355>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to