Bitperi(Periklis Gkolias)

Productivity tips and coding for thriving people

A Primer on Python Partial Functions

Partial functions are one of the most “terrifying concepts” I hear people talking about. Personally, I think the idea is fairly easy to grasp. That is, I will try to explain in a few paragraphs with python and help you escape the math labyrinth of “official documentation”.

What is a partial function

Partial functions are a computer science concept where we can derive a function with x parameters to a function with fewer parameters and constant values set for the more limited function.

They became more mainstream, as functional programming arose and the main pillars of it (map, filter, reduce, etc), require functions as an argument.

Let’s break this down

An example

Searching the official python documentation I found this example:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

So, we have function int which, as you can imagine, takes an argument (number or string) and converts it to an integer (if technically possible). This function also takes various arguments. One of them is base.

Don’t worry about the __doc__ thing, it is the message that is printed when you asked for the documentation of the function.

So in the example above, we invoke the partial factory, to derive a new (more specialized) function from the int one.

Why don’t we just use default arguments?

Interesting question, thanks for asking. The difference between the example above and your proposal is that calling int('110', base=2) will return an integer or in general the result of the execution of the function.

basetwo on the other hand, is a function reference, which in turn you can use it as input for more partial functions or to functions that get other functions as arguments eg map.

So is this like overloading and overriding?

Overloading is when you have one function, with the same name but a different signature. When you create a partial function, you give the function a different name (unless you want for some reason to shadow the original one).

Overriding, on the other hand, refers to a language feature that allows a subclass to provide a specific implementation of a method that is already provided by one of its super-classes. Partial functions provide specialized versions of initial functions but that usually is under a different name and for sure it is not bound to inheritance trees

I see, so it is just a function that modifies functions on the fly

You can say it this way, too.

Based on the python examples again, this is how the partial factory would look like:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

Given a function(func) and a set of values(*args, **keywords), it creates a new function (newfunc) which performs some business logic by invoking the passed function (func) and potentially using *args, **keywords.

Conclusion

Thank you for reading this short article and I hope it was helpful to you. Let me know your thoughts in the comments.

comments powered by Disqus