Defaults

Often we want to have only a few special functions but want also a default function like in match-case or in a switch case

Defaults *args

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, *args):
        return sum(args)
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func(1, 2, 3.5, 0.5, -1, 42.12213412)
48.12213412

you can also have multiple defaults but then the first parameter must be different

import decimal

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, a: decimal.Decimal, *args):
        return decimal.Decimal(sum(args)) * a

    @overload
    def other_func(self, a: int, *args):
        return sum(args) / a
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func(decimal.Decimal(5), 1, 2, 3.5, 0.5, -1, 2.12213412)
40.61067060000000061847913457
>>> example.other_func(1, 2, 3.5, 0.5, -1, 42.12213412)
1.624426824

Defaults **kwargs

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, **kwargs):
        return ", ".join([str(obj) for obj in kwargs.values()])
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func(foo="bar", bar=12, foobar=42.21)
bar, 12, 42.21

you can also have multiple defaults but then the first parameter must be different

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, val_a: str, **kwargs):
        return val_a + "# " + ", ".join([str(obj) for obj in kwargs.values()])

    @overload
    def other_func(self, val_a: int, **kwargs):
        return ", ".join([str(obj) for obj in kwargs.values()]) * val_a
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func("log", foo="bar", bar=12, foobar=42.21)
log# bar, 12, 42.21
>>> example.other_func(val_a="timestamp", foo="bar", bar=12, foobar=42.21)
timestamp# bar, 12, 42.21
>>> example.other_func(2, foo="bar", bar=12, foobar=42.21)
bar, 12, 42.21bar, 12, 42.21
>>> example.other_func(val_a=3, foo="bar", bar=12, foobar=42.21)
bar, 12, 42.21bar, 12, 42.21bar, 12, 42.21

Defaults args and *kwargs

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, *args, **kwargs):
        return sum(args) * sum(kwargs.values())
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func(1, 3, 5, bar=2, foo=4, barfoo=6)
108

you can also have multiple defaults but then the first parameter must be different

from strongtyping_pyoverload import overload


class Example:
    @overload
    def other_func(self, a: str, b: str):
        return f"{a.lower()}-{b.lower()}"

    @overload
    def other_func(self, val_a: int, *args, **kwargs):
        return sum(args) * sum(kwargs.values()) / val_a

    @overload
    def other_func(self, val_a: str, *args, **kwargs):
        return f"{val_a}: {sum(args) * sum(kwargs.values())}"
>>> example = Example()
>>> example.other_func("Foo", "Bar")
foo-bar
>>> example.other_func(10, 3, 5, bar=2, foo=4, barfoo=6)
9.6
>>> example.other_func("example", 3, 5, bar=2, foo=4, barfoo=6)
example: 96