[pypy-dev] Alternatives to multiple inheritance

Benjamin Peterson benjamin at python.org
Fri Apr 18 01:13:49 CEST 2014


On Thu, Apr 17, 2014, at 15:42, Ryan Gonzalez wrote:
> I’m writing a scripting language using RPython. I have a base class for
> all
> my objects. Now, I have an exception object. The exception object needs
> to
> derive from my base class in order for me to use polymorphism inside the
> interpreter. However, it also needs to derive from the Exception class to
> be throwable. My code looked kind of like this:
> 
> class BaseObject(object):
>     pass
> class MyException(BaseObject, Exception):
>     ...
> 
> However, upon trying to compile the code, I got this error:
> 
> [translation:ERROR] AssertionError: multiple inheritance only
> supported with _mixin_: <class 'bolt.objects.BoltException'>
> [translation:ERROR] Processing block:
> [translation:ERROR]  block at 122 is a <class
> 'rpython.flowspace.flowcontext.SpamBlock'>
> [translation:ERROR]  in (bolt.main:10)parse_and_run
> [translation:ERROR]  containing the following operations:
> [translation:ERROR]        v0 = simple_call((type interpreter))
> [translation:ERROR]  --end--
> 
> bolt.objects.BoltException is my exception class. If I remove the
> Exception
> base, I get this:
> 
> [translation:ERROR] AssertionError
> [translation:ERROR] Processing block:
> [translation:ERROR]  block at 9 is a <class
> 'rpython.flowspace.flowcontext.SpamBlock'>
> [translation:ERROR]  in (bolt.main:4)run_file
> [translation:ERROR]  containing the following operations:
> [translation:ERROR]        v0 = simple_call((function create_file), p_0,
> ('r'))
> [translation:ERROR]        v1 = getattr(v0, ('read'))
> [translation:ERROR]        v2 = simple_call(v1)
> [translation:ERROR]        v3 = simple_call((function parse_and_run), v2)
> [translation:ERROR]        v4 = getattr(v0, ('close'))
> [translation:ERROR]        v5 = simple_call(v4)
> [translation:ERROR]  --end--
> 
> The only thing about multiple inheritance and RPython I found was
> this<https://mail.python.org/pipermail//pypy-commit/2011-November/055925.html>
> .
> 
> My current idea is to have my base object derive from Exception instead
> of
> nothing. I was wondering if there’s a better solution, however.

In this case, you may want to do what the PyPy Python interpreter does.
There is one interpreter level exception for app-level exceptions called
OperationError. OperationError wraps the app-level exception object
inside of it.


More information about the pypy-dev mailing list