Hoe kan ik argumenten binden aan gegeven waarden in Python-functies?

Ik heb een aantal functies met een combinatie van positionele en trefwoordargumenten, en ik zou een van hun argumenten willen binden aan een bepaalde waarde (die pas bekend is na de functiedefinitie). Is er een algemene manier om dat te doen?

Mijn eerste poging was:

def f(a,b,c): print a,b,c
def _bind(f, a): return lambda b,c: f(a,b,c)
bound_f = bind(f, 1)

Hiervoor moet ik echter de exacte argumenten weten die aan fzijn doorgegeven, en ik kan geen enkele functie gebruiken om alle functies waarin ik geïnteresseerd ben te binden (aangezien ze verschillende argumentlijsten hebben).


Antwoord 1, autoriteit 100%

>>> from functools import partial
>>> def f(a, b, c):
...   print a, b, c
...
>>> bound_f = partial(f, 1)
>>> bound_f(2, 3)
1 2 3

Antwoord 2, autoriteit 14%

U wilt waarschijnlijk de partialfunctie van functools.


Antwoord 3, autoriteit 10%

Zoals gesuggereerd door MattH’s antwoord, is functools.partialde juiste keuze.

Uw vraag kan echter worden gelezen als “hoe kan ik partialimplementeren”. Wat uw code mist, is het gebruik van *args, **kwargs– 2 van dergelijke toepassingen, eigenlijk:

def partial(f, *args, **kwargs):
    def wrapped(*args2, **kwargs2):
        return f(*args, *args2, **kwargs, **kwargs2)
    return wrapped

Antwoord 4, autoriteit 4%

U kunt partialen update_wrapperom argumenten te binden gegeven waarden en behouden__name__en __doc__van de originele functie:

from functools import partial, update_wrapper
def f(a, b, c):
    print(a, b, c)
bound_f = update_wrapper(partial(f, 1000), f)
# This will print 'f'
print(bound_f.__name__)
# This will print 1000, 4, 5
bound_f(4, 5)

Other episodes