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 f
zijn 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 partial
functie van functools.
Antwoord 3, autoriteit 10%
Zoals gesuggereerd door MattH’s antwoord, is functools.partial
de juiste keuze.
Uw vraag kan echter worden gelezen als “hoe kan ik partial
implementeren”. 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 partial
en update_wrapper
om 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)