When it comes to version and API changes, Python optional arguments are evil.
Say you define a function like this:
def someFunction(param1, param2, optParam=None)
# code
And you are calling it from module whatever.py like this:
retValue = someFunction(x, y, z)
A few weeks later you need to change the API adding a new mandatory parameter:
def someFunction(param1, param2, param3, optParam=None)
# code
But you forget to update the call at whatever.py. It does not raise any exception but there is a big semantic error, “someFunction” is considering “z” as the “param3” where the caller is considering it the “optParam”.
I try to avoid optional arguments as much as I can.