classification
Title: inspect.getmro() fails when base class lacks __bases__ attribute.
Type: Stage: resolved
Components: Versions: Python 2.7
process
Status: closed Resolution: out of date
Dependencies: Superseder:
Assigned To: Nosy List: billyziege, iritkatriel, r.david.murray
Priority: normal Keywords:

Created on 2015-12-16 15:31 by billyziege, last changed 2020-11-30 22:51 by iritkatriel. This issue is now closed.

Messages (4)
msg256525 - (view) Author: Brandon Zerbe (billyziege) Date: 2015-12-16 15:31
I am using a possibly non-standard python package called Forthon, and when I inspect an object that is dependent on the Forthon class, I get the following error:

  File "/Users/zerbeb/homemade_programs/config2class/src/method_parsing.py", line 18, in get_all_init_args
    inherited_classes = inspect.getmro(class_obj)  
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 346, in getmro
    if hasattr(cls, "__bases__"):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 337, in _searchbases
    for base in cls.__bases__:
AttributeError: 'Forthon' object has no attribute '__bases__'

This was easy enough to fix, simply add "if not hasattr(cls,'__bases__'): return" to the _searchbases function:

def _searchbases(cls, accum):
    # Simulate the "classic class" search order.
    if cls in accum:
        return
    if not hasattr(cls, "__bases__"): #Additional code.
        return
    accum.append(cls)
    for base in cls.__bases__:
        _searchbases(base, accum)

Maybe you have a better solution, but I think this edge case can be trivially solved however you decide to edit the code.

Thanks!
msg256526 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2015-12-16 15:54
Which version of python are you running?  I can't match that traceback up to the code in the current 2.7 inspect module.

That said, the same issue probably exists in the current code.  A 2.7 class is expected to have either an __mro__ or a __bases__ attribute, and if it has neither inspect probably *should* throw an error, since it can't know what to do with the class.  The error could be clearer, though.

But, let's see what others think.
msg256527 - (view) Author: Brandon Zerbe (billyziege) Date: 2015-12-16 17:03
I am using Python 2.7.5.  The segment of code from inspect that I previously extracted came from line 332 although you may also find it by "finding" _searchbases.

This is really an issue with Forthon:

http://hifweb.lbl.gov/Forthon/

Specifically the Forthon class, which I think is older than current standards.  If you guys want this Forthon class to flag an error (I can work around that too), than the proposed fix I sent can be rejected, and this ticket can be closed.  I just wanted to bring this case to you attention just in case.

Thanks again,

Brandon

Quoting "R. David Murray" <report@bugs.python.org>:

>
> R. David Murray added the comment:
>
> Which version of python are you running?  I can't match that 
> traceback up to the code in the current 2.7 inspect module.
>
> That said, the same issue probably exists in the current code.  A 2.7 
> class is expected to have either an __mro__ or a __bases__ attribute, 
> and if it has neither inspect probably *should* throw an error, since 
> it can't know what to do with the class.  The error could be clearer, 
> though.
>
> But, let's see what others think.
>
> ----------
> nosy: +r.david.murray
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue25884>
> _______________________________________
>
msg382205 - (view) Author: Irit Katriel (iritkatriel) * (Python committer) Date: 2020-11-30 22:51
The _searchbases function was removed here, when getmro was simplified following the removal of old style classes:

https://github.com/python/cpython/commit/b82c8e5b27a8d8ec441aeab5d01d6d9bd8e6d7ef
History
Date User Action Args
2020-11-30 22:51:53iritkatrielsetstatus: open -> closed

nosy: + iritkatriel
messages: + msg382205

resolution: out of date
stage: resolved
2015-12-16 17:03:24billyziegesetmessages: + msg256527
2015-12-16 15:54:48r.david.murraysetnosy: + r.david.murray
messages: + msg256526
2015-12-16 15:31:56billyziegecreate