Mypy 1.15 Released
We’ve just uploaded mypy 1.15 to the Python Package Index (PyPI). Mypy is a static type checker for Python. This release includes new features, performance improvements and bug fixes. You can install it as follows:
python3 -m pip install -U mypy
You can read the full documentation for this release on Read the Docs.
Performance Improvements
Mypy is up to 40% faster in some use cases. This improvement comes largely from tuning the performance of the garbage collector. Additionally, the release includes several micro-optimizations that may be impactful for large projects.
Contributed by Jukka Lehtosalo (PR 18306, PR 18302, PR 18298, PR 18299).
Mypyc Accelerated Mypy Wheels for ARM Linux
For best performance, mypy can be compiled to C extension modules using mypyc. This makes mypy 3-5x faster than when interpreted with pure Python. We now build and upload mypyc accelerated mypy wheels for manylinux_aarch64 to PyPI, making it easy for Linux users on ARM platforms to realise this speedup -- just pip install the latest mypy.
Contributed by Christian Bundy and Marc Mueller (PR mypy_mypyc-wheels#76, PR mypy_mypyc-wheels#89).
--strict-bytes
By default, mypy treats bytearray and memoryview values as assignable to the bytes type, for historical reasons. Use the --strict-bytes flag to disable this behavior. PEP 688 specified the removal of this special case. The flag will be enabled by default in mypy 2.0.
Contributed by Ali Hamdan (PR 18263) and Shantanu Jain (PR 13952).
Improvements to Reachability Analysis and Partial Type Handling in Loops
This change results in mypy better modelling control flow within loops and hence detecting several previously ignored issues. In some cases, this change may require additional explicit variable annotations.
Contributed by Christoph Tyralla (PR 18180, PR 18433). (Speaking of partial types, remember that we plan to enable --local-partial-types by default in mypy 2.0.)
Better Discovery of Configuration Files
Mypy will now walk up the filesystem (up until a repository or file system root) to discover configuration files. See the mypy configuration file documentation for more details.
Contributed by Mikhail Shiryaev and Shantanu Jain (PR 16965, PR 18482)
Better Line Numbers for Decorators and Slice Expressions
Mypy now uses more correct line numbers for decorators and slice expressions. In some cases, you may have to change the location of a # type: ignore comment.
Contributed by Shantanu Jain (PR 18392, PR 18397).
Drop Support for Python 3.8
Mypy no longer supports running with Python 3.8, which has reached end-of-life. When running mypy with Python 3.9+, it is still possible to type check code that needs to support Python 3.8 with the --python-version 3.8 argument. Support for this will be dropped in the first half of 2025!
Contributed by Marc Mueller (PR 17492).
Mypyc Improvements
- Fix __init__ for classes with @attr.s(slots=True) (Advait Dixit, PR 18447)
- Report error for nested class instead of crashing (Valentin Stanciu, PR 18460)
- Fix InitVar for dataclasses (Advait Dixit, PR 18319)
- Remove unnecessary mypyc files from wheels (Marc Mueller, PR 18416)
- Fix issues with relative imports (Advait Dixit, PR 18286)
- Add faster primitive for some list get item operations (Jukka Lehtosalo, PR 18136)
- Fix iteration over NamedTuple objects (Advait Dixit, PR 18254)
- Mark mypyc package with py.typed (bzoracler, PR 18253)
- Fix list index while checking for Enum class (Advait Dixit, PR 18426)
Stubgen Improvements
- Improve dataclass init signatures (Marc Mueller, PR 18430)
- Preserve dataclass_transform decorator (Marc Mueller, PR 18418)
- Fix UnpackType for 3.11+ (Marc Mueller, PR 18421)
- Improve self annotations (Marc Mueller, PR 18420)
- Print InspectError traceback in stubgen walk_packages when verbose is specified (Gareth, PR 18224)
Stubtest Improvements
- Fix crash with numpy array default values (Ali Hamdan, PR 18353)
- Distinguish metaclass attributes from class attributes (Stephen Morton, PR 18314)
Fixes to Crashes
- Prevent crash with Unpack of a fixed tuple in PEP695 type alias (Stanislav Terliakov, PR 18451)
- Fix crash with --cache-fine-grained --cache-dir=/dev/null (Shantanu, PR 18457)
- Prevent crashing when match arms use name of existing callable (Stanislav Terliakov, PR 18449)
- Gracefully handle encoding errors when writing to stdout (Brian Schubert, PR 18292)
- Prevent crash on generic NamedTuple with unresolved typevar bound (Stanislav Terliakov, PR 18585)
Documentation Updates
- Add inline tabs to documentation (Marc Mueller, PR 18262)
- Document any TYPE_CHECKING name works (Shantanu, PR 18443)
- Update documentation to not mention 3.8 where possible (sobolevn, PR 18455)
- Mention ignore_errors in exclude documentation (Shantanu, PR 18412)
- Add Self misuse to common issues (Shantanu, PR 18261)
Other Notable Fixes and Improvements
- Fix literal context for ternary expressions (Ivan Levkivskyi, PR 18545)
- Ignore dataclass.__replace__ LSP violations (Marc Mueller, PR 18464)
- Bind self to the class being defined when checking multiple inheritance (Stanislav Terliakov, PR 18465)
- Fix attribute type resolution with multiple inheritance (Stanislav Terliakov, PR 18415)
- Improve security of our GitHub Actions (sobolevn, PR 18413)
- Unwrap type[Union[...]] when solving type variable constraints (Stanislav Terliakov, PR 18266)
- Allow Any to match sequence patterns in match/case (Stanislav Terliakov, PR 18448)
- Fix parent generics mapping when overriding generic attribute with property (Stanislav Terliakov, PR 18441)
- Add dedicated error code for explicit Any (Shantanu, PR 18398)
- Reject invalid ParamSpec locations (Stanislav Terliakov, PR 18278)
- Stop suggesting stubs that have been removed from typeshed (Shantanu, PR 18373)
- Allow inverting --local-partial-types (Shantanu, PR 18377)
- Allow to use Final and ClassVar after Python 3.13 (정승원, PR 18358)
- Update suggestions to include latest stubs in typeshed (Shantanu, PR 18366)
- Fix --install-types masking failure details (wyattscarpenter, PR 17485)
- Reject promotions when checking against protocols (Christoph Tyralla, PR 18360)
- Don't erase type object arguments in diagnostics (Shantanu, PR 18352)
- Clarify status in dmypy status output (Kcornw, PR 18331)
- Disallow no-argument generic aliases when using PEP 613 explicit aliases (Brian Schubert, PR 18173)
- Suppress errors for unreachable branches in conditional expressions (Brian Schubert, PR 18295)
- Do not allow ClassVar and Final in TypedDict and NamedTuple (sobolevn, PR 18281)
- Report error if not enough or too many types provided to TypeAliasType (bzoracler, PR 18308)
- Use more precise context for TypedDict plugin errors (Brian Schubert, PR 18293)
- Use more precise context for invalid type argument errors (Brian Schubert, PR 18290)
- Do not allow type[] to contain Literal types (sobolevn, PR 18276)
- Allow bytearray/bytes comparisons with --strict-bytes (Jukka Lehtosalo, PR 18255)
Acknowledgements
Thanks to all mypy contributors who contributed to this release:
- Advait Dixit
- Ali Hamdan
- Brian Schubert
- bzoracler
- Cameron Matsui
- Christoph Tyralla
- Gareth
- Ivan Levkivskyi
- Jukka Lehtosalo
- Kcornw
- Marc Mueller
- Mikhail f. Shiryaev
- Shantanu
- sobolevn
- Stanislav Terliakov
- Stephen Morton
- Valentin Stanciu
- Viktor Szépe
- wyattscarpenter
- 정승원
I’d also like to thank my employer, Dropbox, for supporting mypy development.