7

I would like to use functools.partial to set a certain argument to a constant and at the same time remove the argument altogether.

Let me explain it using a simple example.

from functools import partial
def f(a, b):
    return a * b

g = partial(f, b=2)

However, this function g still has the following calling signature:

g?

Signature:      g(a, *, b=1)
Call signature: g(*args, **kwargs)
Type:           partial
String form:    functools.partial(<function f at 0x7ff7045289d8>, b=1)
File:           /opt/conda/envs/dev/lib/python3.6/functools.py
Docstring:     
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.

I could of course do this with a lambda function like:

def f(a, b):
    return a * b

g = lambda a: f(a, b=2)

with the correct calling signature:

g?

Signature: g(a)
Docstring: <no docstring>
File:      ~/Work/<ipython-input-7-fc5f3f492590>
Type:      function

The downside of using lamdba functions is that I would need to write down all the arguments again. In my simple example this doesn't matter, but look at this:

phase_func = lambda site1, site2, B_x, B_y, B_z, orbital, e, hbar: \
    phase_func(site1, site2, B_x, B_y, B_z, orbital, e, hbar, xyz_offset=(0,0,0))
# or this
phase_func = partial(phase_func, xyz_offset=(0,0,0)

Why would I even want this?

Later in my code I use wrappers that can generate a new function by multiplying two other functions, like combine(function1, function2, operator.mul). This combine function looks at all the arguments, therefore I need to remove the argument after setting it.

johnbaltis
  • 1,413
  • 4
  • 14
  • 26
  • Then use the `lambda`, or make sure `combine` sets the appropriate default values. BTW I see `Signature: g(a, *, b=2)` as per your `partial` call. – AChampion May 03 '17 at 13:17
  • 1
    Have you confirmed this is an actual problem? The 'signature' you see is `inspect.signature` *special-casing `partial` objects*. If `combine()` does *not* use `inspect.signature()` then you should not actually see this issue. – Martijn Pieters May 03 '17 at 13:18
  • If you wrote `combine()`, then the better solution is to detect signatures differently. – Martijn Pieters May 03 '17 at 13:20

0 Answers0