New submission from Muhammad Tauqir Ahmad:

If a method `foo` of object instance `obj` is injected into it using a method 
from a different object instance, `inspect.getsource(obj.foo)` fails with the 
error message:

TypeError: <bound method Foo.say of <__main__.Foo object at 0x7fd348662cd0>> is 
not a module, class, method, function, traceback, frame, or code object

in inspect.py:getfile()

What basically is happening is that if you have `obj1`, `obj2` and `obj2` has 
method `foo`, setting `obj1.foo = types.MethodType(obj2.foo, obj1)` succeeds 
but is "double-bound-method" if that's a term. So during `getsource()`, it 
fails because `obj1.foo.__func__` is a method not a function as is expected.

Possible solutions:
1. Error message should be more clear if this is the intended behavior - right 
now it claims it's not a method,function etc. when it is indeed a method.
2. MethodType() should fail if the first argument is not a function.
3. inspect.getsource() should recursively keep "unpacking" till it finds an 
object that it can get the source for. 

Reproducer attached.

----------
components: Library (Lib)
files: reproducer.py
messages: 205942
nosy: mtahmed
priority: normal
severity: normal
status: open
title: inspect.getsource(obj.foo) fails when foo is an injected method 
constructed from another method
type: behavior
versions: Python 2.6, Python 2.7, Python 3.1, Python 3.2, Python 3.3
Added file: http://bugs.python.org/file33098/reproducer.py

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue19956>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to