Skip to main content

overrides

https://img.shields.io/pypi/v/overrides.svg http://pepy.tech/badge/overrides

A decorator @override that verifies that a method that should override an inherited method actually does, and that.

Copies the docstring of the inherited method to the overridden method.

Since signature validation and docstring inheritance are performed on class creation and not on class instantiation, this library significantly improves the safety and experience of creating class hierarchies in Python without significantly impacting performance. See https://stackoverflow.com/q/1167617 for the initial inspiration for this library.

Motivation

Python has no standard mechanism by which to guarantee that (1) a method that previously overrode an inherited method continues to do so, and (2) a method that previously did not override an inherited will not override now. This opens the door for subtle problems as class hierarchies evolve over time. For example,

  1. A method that is added to a superclass is shadowed by an existing method with the same name in a subclass.

  2. A method of a superclass that is overridden by a subclass is renamed in the superclass but not in the subclass.

  3. A method of a superclass that is overridden by a subclass is removed in the superclass but not in the subclass.

  4. A method of a superclass that is overridden by a subclass but the signature of the overridden method is incompatible with that of the inherited one.

These can be only checked by explicitly marking method override in the code.

Python also has no standard mechanism by which to inherit docstrings in overridden methods. Because most standard linters (e.g., flake8) have rules that require all public methods to have a docstring, this inevitably leads to a proliferation of See parent class for usage docstrings on overridden methods, or, worse, to a disabling of these rules altogether. In addition, mediocre or missing docstrings degrade the quality of tooltips and completions that can be provided by an editor.

Installation

Compatible with Python 3.6+.

$ pip install overrides

Usage

Use @override to indicate that a subclass method should override a superclass method.

from overrides import override

class SuperClass:

    def foo(self):
        """This docstring will be inherited by any method that overrides this!"""
        return 1

    def bar(self, x) -> str:
        return x

class SubClass(SuperClass):

    @override
    def foo(self):
        return 2

    @override
    def bar(self, y) -> int: # Raises, because the signature is not compatible.
        return y

    @override
    def zoo(self): # Raises, because does not exist in the super class.
        return "foobarzoo"

Use EnforceOverrides to require subclass methods that shadow superclass methods to be decorated with @override.

from overrides import EnforceOverrides

class SuperClass(EnforceOverrides):

    def foo(self):
        return 1

class SubClass(SuperClass):

    def foo(self): # Raises, because @override is missing.
        return 2

Use @final to indicate that a superclass method cannot be overriden. With Python 3.11 and above @final is directly typing.final.

from overrides import EnforceOverrides, final, override

class SuperClass(EnforceOverrides):

    @final
    def foo(self):
        return 1

class SubClass(SuperClass):

    @override
    def foo(self): # Raises, because overriding a final method is forbidden.
        return 2

Note that @classmethod and @staticmethod must be declared before @override.

from overrides import override

class SuperClass:

    @staticmethod
    def foo(x):
        return 1

class SubClass(SuperClass):

    @staticmethod
    @override
    def foo(x):
        return 2

Flags of control

# To prevent all signature checks do:
@override(check_signature=False)
def some_method(self, now_this_can_be_funny_and_wrong: str, what_ever: int) -> "Dictirux":
    pass

# To do the check only at runtime and solve some forward reference problems
@override(check_at_runtime=True)
def some_other_method(self, ..) -> "SomethingDefinedLater":
    pass

a.some_other_method() # Kaboom if not SomethingDefinedLater

Contributors

This project exists only through the work of all the people who contribute.

mkorpela, drorasaf, ngoodman90, TylerYep, leeopop, donpatrice, jayvdb, joelgrus, lisyarus, soulmerge, rkr-at-dbx, ashwin153, brentyi, jobh, tjsmart.

Metadata

Release files for overrides 7.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for overrides 7.3.0
File Size Uploaded
overrides-7.3.0.tar.gz 24.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for overrides 7.3.0
File Interpreter ABI Platform
overrides-7.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 42.5 kB

Release files / overrides-7.3.0.tar.gz

Download URL overrides-7.3.0.tar.gz
Size 24.8 kB
Tags Source
SHA-256 checksum
How to use checksums
13aec54e55944c5a0d39922aa898c84ec0fee3962aeff5e4ce96c877c8683a04
BLAKE2b-256 checksum
How to use checksums
fde742967d91addf3a344212cb70c71d4e25766433a8d87f5a120f4f498f81a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.12

Release files / overrides-7.3.0-py3-none-any.whl

Download URL overrides-7.3.0-py3-none-any.whl
Size 17.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
81b0848e1712396ed7359d4d56a6c6c6564f3e8c9b38102472ad7887c3e2b7a2
BLAKE2b-256 checksum
How to use checksums
fb05a7e5fd1e954bc8537bf9fd7e2d6836bc8541df3dd846b9736ffd2a170b49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.12

Release history Release notifications | RSS feed

7.7.0

2 release files

7.6.0

2 release files

7.5.0

2 release files

7.4.0

2 release files

7.3.1

2 release files

This release

7.3.0 This release

2 release files

7.2.0

2 release files

7.1.0

2 release files

7.0.0

2 release files

6.5.0

2 release files

6.4.0

2 release files

6.3.0

2 release files

6.2.0

2 release files

6.1.0

2 release files

6.0.1

2 release files

6.0.0

2 release files

5.0.1

2 release files

5.0.0

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.0

1 release file

3.1.0

1 release file

3.0.0

1 release file

2.8.0

1 release file

2.7.0

1 release file

2.6

1 release file

2.5

1 release file

2.4

1 release file

2.3

1 release file

2.2

1 release file

2.1

1 release file

2.0

1 release file

1.9

1 release file

1.8

2 release files

1.7

1 release file

1.6

1 release file

0.5

1 release file

0.4

2 release files

0.3

2 release files

0.2

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page