This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author isedev
Recipients isedev
Date 2014-09-07.14:45:40
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1410101141.24.0.25482778458.issue22355@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2014-09-07 14:45:41isedevsetrecipients: + isedev
2014-09-07 14:45:41isedevsetmessageid: <1410101141.24.0.25482778458.issue22355@psf.upfronthosting.co.za>
2014-09-07 14:45:41isedevlinkissue22355 messages
2014-09-07 14:45:40isedevcreate