smarie / python-makefun

Dynamically create python functions with a proper signature.
https://smarie.github.io/python-makefun/
BSD 3-Clause "New" or "Revised" License
118 stars 15 forks source link

Inconsistency in behavior of `functools.partial` and `makefun.partial` #95

Open elchupanebrej opened 1 year ago

elchupanebrej commented 1 year ago

There is function

def func(a):
    print(f"Arg: {a}")

When it is used by functiools.partial:

from functools import partial

partial(partial(func, a=1), a=2)()
"""
>>> Arg: 2
"""

When it is used by makefun.partial:

from makefun import partial as mpartial

mpartial(mpartial(func, a=1), a=2)()
"""
>>> Arg: 1
"""

So makefun.partial could not be drop-in replacement for functools.partial

smarie commented 10 months ago

Nice finding @elchupanebrej !!

I was not aware that partial could be used to modify assignments already done by a nested partial.

So makefun.partial could not be drop-in replacement for functools.partial

Well, in most applications it can be, as the usage you mention is extremely rare :)

If you would like to propose something, I am open to a PR modifying partial to

Note that storing the preset_kwargs outside of the closure (i.e. on an explicit attribute on the function) could be a solution, but I have not enough knowledge of python internals to be sure that this would not impact performance or have side-effects...