The mypy type-checker recently merged a pull request for metaclass support in mypy. The goal here is to test how far that support extends in Python 2, given mypy didn't even parse Python 2 metaclass declarations previously.
py2_example1.py
is testing cases where the metaclass is defined before its instance, then passing in by name to the__metaclass__
attributepy2_example2.py
consists of my test cases from python/mypy#2413, modified for python 2py2_example3.py
is testing metaclasses defined as a child class named__metaclass__
py3_example1.py
is the equivalent ofpy2/example1.py
but with Python 3 metaclass declarationspy3_example2.py
consists of my test cases from python/mypy#2413six.py
is testing metclasses defined like inpy2/example1.py
, but declared usingsix.with_metaclass
If you're not familliar with Github Gist, you can use the URL of this gist to clone it as a git
repository.
./setup.sh blah
will set up a venv virtualenv at path blah
(or .venv
if no path is passed) and install mypy at the metaclass support commit.
You will have to source
into the virtualenv after that. (source .venv/bin/activate
)
./run_mypy.sh
will typecheck the example files using the current Python environment (make sure you're in a venv with mypy and Python 3).
It's pretty clear that metaclass detection is still not happening in mypy for Python 2 codebases, but if a metaclass is detected (ie in Python 3) then everything seems to work as expected.
Errors to do with the six.py
test case are due to the fact that six.with_metaclass
needs to be special-cased, and it hasn't been special-cased yet.
All in all, this is still fantastic work, and I'm very grateful for it. Still, it means that I'll have to look into updating the metaclass detection logic to support Python 2.
Since the pull request, several issues on the mypy repository have been updated and/or opened, which will fix all the above issues I found (among others):
- mypy doesn't understand
six.with_metaclass
(#1764) - Mypy doesn't recognize metaclass implementing getitem (#1771)
- Add Python 2 support for metaclass (#2823)
- Metaclass is not properly inherited when using multiple inheritance with int (#2824)
- Update the behaviour of the
type
function for metaclasses (#2826)