Je sais que c'est vieux, mais je rencontre ce problème tout le temps, et je pense avoir trouvé une bonne solution. J'utilise une version légèrement modifiée de partial
qui utilise un objet Ellipses ( ...
) comme valeur de remplacement si vous ne la connaissez pas au moment où l'objet est construit. C'est très utile dans ce cas précis !
Voici l'original __call__
méthode de partial
def __call__(self, /, *args, **keywords):
keywords = {**self.keywords, **keywords}
return self.func(*self.args, *args, **keywords)
Au lieu de cela, nous pouvons utiliser le littéral ...
comme un cas spécial pour indiquer une valeur de type "placeholder".
>>> type(...)
<class 'ellipsis'>
Voici l'implémentation complète :
class bind(partial):
"""
An improved version of partial which accepts Ellipsis (...) as a placeholder
"""
def __call__(self, *args, **keywords):
keywords = {**self.keywords, **keywords}
iargs = iter(args)
args = (next(iargs) if arg is ... else arg for arg in self.args)
return self.func(*args, *iargs, **keywords)
L'utilisation est assez simple
def foo(a, b, c, /, *, d):
print(f"A({a}) B({b}) C({c}) D({d})")
f1 = bind(foo, 1, 2, 3, d=4)
f1()
f2 = bind(foo, 1, 2, d=4)
f2(3)
f3 = bind(foo, 1, ..., 3, d=4)
f3(2)
f4 = bind(foo, ..., 2, ..., d=4)
f4(1, 3)
f5 = bind(foo, ..., d=5)
f5(1, 2, 3, d=4)