Python - Pattern matching decorator
In school, we did some haskell project.
And I was blown by the pattern matching.
So, for a side project, I wanted to add a “pattern matching”-like experience to python.
What is a decorator in python ?
Here is an exemple:
from pyfuncpatmatch import pm, _eq
@pm(lambda _: 0, _eq(0))
@pm(lambda _: 1, _eq(1))
def fib_rec(n: int):
"""Calculating fibonacci sequence"""
return fib_rec(n - 1) + fib_rec(n - 2)
# >>> fib_rec(0)
# 0
# >>> fib_rec(1)
# 1
# >>> fib_rec(2)
# 1
# >>> fib_rec(6)
# 8For more exemples, you can see the test file here
When calling the pm function with the code to execute and it’s patterns,
the pm function create a new function inner_decorator that ‘copy’ the
parameters passed to pm and take a function as its uniq argument.
This function (inner_decorator) when called, create a callable class.
A callable class is just a class that define a
__call__method.
This class PM when created, analyse the signature of the decorated function
and organize the args/kwargs that the pm function has.
This PM class ‘replace’ the decorated function. Each time the decorated
function will be called, it will call the PM class instead.
The PM class when called, will analyse its args/kwargs, check if the pattern
is respected, and if yes, execute the function passed to pm function. Else,
it will fallback to the decorated function.
Links:
That was a fun experiment.
Before the rewrite, the code was more messy, and the usage was more hacky.