[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