07:26 <discord_afpy> <Andy K (boss dreamer ou pas)> Salut
14:07 <discord_afpy> <guyzmal> Hello 👋 j'ai une petite question sur le python moderne de 2024. J'apprécie beaucoup le fait qu'on ai du typage, mais je n'ai pas encore trouvé de doc qui explique comment on peut exprimer un type en fonction d'un autre. Par exemple, j'aimerais exprimer des dépendences de ce type:
14:07 <discord_afpy> <guyzmal>
14:07 <discord_afpy> <guyzmal> ```
14:07 <discord_afpy> <guyzmal> def my_func() -> int:
14:07 <discord_afpy> <guyzmal> return 42
14:07 <discord_afpy> <guyzmal>
14:07 <discord_afpy> <guyzmal> def my_other_func(foo: ReturnType[my_func]):
14:07 <discord_afpy> <guyzmal> ...
14:07 <discord_afpy> <guyzmal> ```
14:11 <discord_afpy> <guyzmal> ou encore dire « je veux le type du premier argument de la fonction », « je veux le type du premier élément de la liste »… etc
14:15 <entwanne> Je pense que ce que tu cherches à faire se résoud avec les generics, mais c'est pas toujours évident : https://typing.readthedocs.io/en/latest/reference/generics.html
14:37 <entwanne> mais donc il n'y a pas forcément tu truc facile et statique pour dire "typeof(my_func)" par exemple, par contre tu peux exprimer "je reçois en arguments une fonction Callable[..., T] et un objet de type T"
15:32 <discord_afpy> <fred.et.rick> Salut, un peut comme entwanne, il n’exste pas à ma connaissance de moyen de faire ça, mais j’ai un peu de mal à voir l’utilité, tu aurait un cas d’usage ?
15:40 <discord_afpy> <fred.et.rick> en revanche, c’est tout à fait possible de faire ce genre de choses si tu veux créer un décorateur (exemple sorti tout droit de la doc) ```py
15:40 <discord_afpy> <fred.et.rick> def add_logging[T, **P](f: Callable[P, T]) -> Callable[P, T]:
15:40 <discord_afpy> <fred.et.rick> '''A type-safe decorator to add logging to a function.'''
15:40 <discord_afpy> <fred.et.rick> def inner(*args: P.args, **kwargs: P.kwargs) -> T:
15:40 <discord_afpy> <fred.et.rick> logging.info(f'{f.?name?} was called')
15:40 <discord_afpy> <fred.et.rick> return f(*args, **kwargs)
15:40 <discord_afpy> <fred.et.rick> return inner
15:40 <discord_afpy> <fred.et.rick> ``` ici tu déclare que ta fonction add_logging prend en paramètre un callable, donc tu peux typer génériquement les arguments
19:58 <discord_afpy> <guyzmal> le pourquoi :
19:58 <discord_afpy> <guyzmal>
19:58 <discord_afpy> <guyzmal> c'est une pratique de typage que je mets en œuvre depuis quelques années en typescript, qui est de fixer les types aux « extrémités », et d'utiliser des types relatifs entre, pour contrôler où le typage doit peter et faire en sorte que ça pete si ca doit peter.
19:58 <discord_afpy> <guyzmal>
19:58 <discord_afpy> <guyzmal> En gros : on expose un type avec l'API, on a un autre type avec le modèle, on va utiliser des types relatifs au modele sur toutes les couches intermédiaires, pour que le conflit de type ai lieu au niveau des fonctions de routes de l'API.
19:59 <discord_afpy> <guyzmal> (et qui me vient de l'époque où je faisais de l'ocaml 🥹)
21:00 <entwanne> faudrait voir un exemple concret mais je pense que ça peut se repenser avec des generics
21:55 <debnet> Ca fait peur, j'ai jamais joué aussi loin avec typing mais je trouve que ça devient vite cryptique à ce niveau et ça perd un peu l'intérêt du truc à mes yeux.