4 votes

Indication de type pour plusieurs paramètres de même type ?

Existe-t-il un autre moyen de saisir des paramètres de type hint du même type, autre que :

def foobar(a: int, b: int, c: int, d: str): ...

Peut-être quelque chose comme :

def foobar([a, b, c]: int, d: str): ...

Évidemment fictif, mais quelque chose pour réduire les indices de type répétitif.

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

6voto

Carcigenicate Points 16496

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.

1voto

r.ook Points 6810

Je pense que @Carcigenicate a très bien couvert le sujet, mais puisque votre souci est surtout d'ordre notationnel et que vous voulez juste donner un aspect soigné, vous pourriez envisager d'utiliser indentation de suspension à la place :

def foobar(a: int,
           b: int,
           c: int,
           d: str):
    pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X