Les autres réponses ont fait un bon travail en expliquant duck-typing et la réponse la plus simple par tzot:
Python n'a pas de variables, comme les autres langues où les variables ont un type et une valeur; il a des noms pointant vers des objets, qui connaissent leur type.
Cependant, une chose intéressante a changé depuis 2010 avec la implementaion de PEP 3107 lorsque la question est posée. Vous pouvez maintenant spécifier le type d'un attribut et le type de la valeur de retour comme ceci:
def pick(l: list, index: int) -> int:
return l[index]
Nous pouvons ici voir qu' pick
prend 2 paramètres, une liste l
et un entier index
. Il doit également retourner un entier.
Donc, ici, il est implicite qu' l
est une liste d'entiers où l'on peut voir sans trop d'effort, mais pour des fonctions plus complexes, il peut être un peu confus quant à ce que la liste doit contenir. Nous voulons également que la valeur par défaut de index
à 0. Pour résoudre ce problème, vous pouvez choisir d'écrire pick
comme ceci à la place:
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
Mais il est important de noter que Python habitude de soulever un TypeError
si vous passez un flotteur en index
, la raison pour cela est l'un des principaux points en Python de la philosophie de conception: "Nous sommes tous des adultes consentants ici", ce qui signifie que vous être conscient de ce que vous pouvez transmettre à une fonction et que vous ne pouvez pas. Si vous voulez vraiment écrire le type de code de sécurité, vous pouvez utiliser l' isinstance
fonction pour vérifier que l'argument passé est le type approprié ou une sous-classe comme ceci:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
PEP 3107 n'est pas seulement d'améliorer la lisibilité du code, mais a également plusieurs raccord usecases que vous pouvez lire ici.
Auparavant, lorsque l'on documentée code Python avec par exemple le Sphinx des fonctionnalités similaires pourraient être obtenus par l'écriture docstrings formaté comme ceci:
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
Toutefois, cela prend quelques lignes, le nombre exact dépend de façon explicite que vous voulez être et comment vous format votre docstring, mais il devrait être clair pour vous comment PEP 3107 offre une alternative qui est à bien des égards supérieurs.