Les seuls moyens que je connaisse impliquent de "conditionner" les paramètres d'une certaine manière.
En raison de la façon dont les var-args fonctionnent, vous pourriez modifier un peu votre ordre et prendre les arguments comme var-args :
def foobar(d: str, *args: int): …
args
tient maintenant a
, b
et c
(ainsi que tout ce qui est transmis).
Dans le même ordre d'idées, vous pourriez transmettre une liste :
from typing import List
def foobar(args: List[int], d: str): …
Ce qui est essentiellement la même chose que ci-dessus.
Bien sûr, ils sont tous deux accompagnés de la grave L'inconvénient est que vous n'avez plus la possibilité de contrôler statiquement l'arité, ce qui est sans doute un problème encore plus grave que de ne pas pouvoir contrôler statiquement le type.
On peut contourner ce problème en utilisant un tuple pour garantir la longueur :
from typing import Tuple
def foobar(args: Tuple[int, int, int], d: str): …
Mais bien sûr, cela comporte autant de répétitions que votre code original (et nécessite d'empaqueter les arguments dans un tuple), donc il n'y a pas vraiment de gain.
Je ne connais pas de moyen "sûr" de faire littéralement ce que vous voulez.
2 votes
Don't Repeat Yourself devrait s'appeler Don't Be Redundant. Ce n'est pas parce que vous répétez quelque chose que vous ne devez pas (ou ne devriez pas) le répéter.
0 votes
@chepner Techniquement, il n'y a pas de répétitions ici.
a != b != c