A naive implementation of C3 linearization algorithm used in Python's MRO
Project description
C3 Linearization Algorithm
c3linear
is a naïve implementation of
C3 linearization algorithm.
It's used in Python 2.3+ for Method Resolution Order.
See Raymond Hettinger's Python’s super() considered super! for more information.
About implementation
The recursive implementation can be found at c3linear.mro.mro
.
It used an auxiliary function _merge
as well as a bunch of classes
to help with algorithm's readability.
Motivation
The project's come to life as a byproduct of debugging an overcomplicated hierarchy of mixin classes. I thought I knew how exactly MRO is computed, but it turned out I didn't.
I've tried to keep the code idiomatic and easy to follow at the expense of performance. The project is really took a couple of hours to complete. Although I didn't care about time complexity and didn't check correctness as thoroughly as I should, I think the project may help someone who want to learn how Python's Method Resolution Order works.
Usage
Library
- Get the code and install it with
python setup.py install
(Python 3.6+ required) - Import
from c3linear.mro import mro
- Check against built-in MRO:
>>> class A: pass
>>> class`B(A): pass
>>> mro(B) == B.mro()
True
Take a look at tests
for more examples.
Testing
- Install dependencies:
pip install -e .
- (Optional) Install extra packages:
pip install -e .[extra]
- Run tests with:
python setup.py test
- Run
flake8
for PEP8 compliance testing:
python setup.py flake8
- Run
mypy
:
mypy c3linear/
Contributing
If you've found a bug, please open an issue describing the problem first.
Licence
The project is licensed under MIT License. For further information see
LINCENSE
file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.