J'ai récemment remarqué quelque chose d'intéressant en regardant la spécification de grammaire Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
Le bloc optionnel «flèche» était absent dans Python 2 et je n'ai trouvé aucune information concernant sa signification dans Python 3. Il s'avère que c'est Python correct et il est accepté par l'interpréteur:
def f(x) -> 123:
return x
J'ai pensé que cela pourrait être une sorte de syntaxe de condition préalable, mais:
- Je ne peux pas tester
x
ici, c'est encore indéfini, - Peu importe ce que je mets après la flèche (par exemple
2 < 1
), cela n'affecte pas le comportement de la fonction.
Quelqu'un habitué à cette syntaxe pourrait-il l'expliquer?
.__annotations__
qu'attribut.__annotations__
attribut est un dictionnaire. La cléreturn
est celle utilisée pour récupérer la valeur après la flèche.Ce sont des annotations de fonction couvertes dans PEP 3107 . Plus précisément, le
->
marque l'annotation de la fonction de retour.Exemples:
Les annotations sont des dictionnaires, vous pouvez donc le faire:
Vous pouvez également avoir une structure de données python plutôt qu'une simple chaîne:
Ou, vous pouvez utiliser des attributs de fonction pour valider les valeurs appelées:
Impressions
la source
Comme d'autres réponses l'ont indiqué, le
->
symbole est utilisé dans le cadre des annotations de fonction. Dans les versions plus récentes de Python>= 3.5
, cependant, il a une signification définie .PEP 3107 - Les annotations de fonction décrivaient la spécification, définissant les changements de grammaire, l'existence
func.__annotations__
dans laquelle ils sont stockés et le fait que son cas d'utilisation soit toujours ouvert.En Python
3.5
cependant, PEP 484 - Type Hints attache une seule signification à ceci:->
est utilisé pour indiquer le type retourné par la fonction. Il semble également que cela sera appliqué dans les futures versions, comme décrit dans Qu'en est-il des utilisations existantes des annotations :(Souligner le mien)
Cela n'a pas été réellement implémenté pour
3.6
autant que je sache, il pourrait donc être transféré vers les versions futures.Selon cela, l'exemple que vous avez fourni:
sera interdite à l'avenir (et dans les versions actuelles sera source de confusion), il faudrait la changer en:
pour qu'il décrive efficacement cette fonction
f
retourne un objet de typeint
.Les annotations ne sont en aucun cas utilisées par Python lui-même, il les remplit et les ignore à peu près. C'est aux bibliothèques tierces de travailler avec elles.
la source
Dans le code suivant:
le
-> int
juste indique quef()
renvoie un entier (mais cela ne force pas la fonction à renvoyer un entier). Elle s'appelle une annotation de retour et est accessible en tant quef.__annotations__['return']
.Python prend également en charge les annotations de paramètres:
: float
indique aux personnes qui lisent le programme (et certaines bibliothèques / programmes tiers, par exemple pylint) que celax
devrait être afloat
. Il est accessible en tant quef.__annotations__['x']
, et n'a aucune signification en soi. Consultez la documentation pour plus d'informations:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
la source
Cela signifie le type de résultat renvoyé par la fonction, mais il peut être
None
.Il est répandu dans les bibliothèques modernes orientées sur Python 3.x.
Par exemple, il y a dans le code de bibliothèque pandas-profiling en de nombreux endroits par exemple:
la source
def function(arg)->123:
C'est simplement un type de retour, entier dans ce cas, peu importe le nombre que vous écrivez.
comme Java :
Mais pour Python (comment Jim Fasarakis Hilliard l'a dit), le type de retour est juste un indice , donc c'est suggérer le retour mais permet quand même de renvoyer un autre type comme une chaîne ..
la source
Mon résumé:
Simplement
->
est introduit pour que les développeurs spécifient éventuellement le type de retour de la fonction. Voir la proposition d'amélioration Python 3107Ceci est une indication de la façon dont les choses peuvent évoluer à l'avenir alors que Python est largement adopté - une indication vers un typage fort - c'est mon observation personnelle.
Vous pouvez également spécifier des types d'arguments. La spécification du type de retour des fonctions et des arguments aidera à réduire les erreurs logiques et à améliorer les améliorations du code.
Vous pouvez avoir des expressions comme type de retour (à la fois au niveau de la fonction et du paramètre) et le résultat des expressions est accessible via l'attribut 'return' de l'objet annotations . les annotations seront vides pour l'expression / valeur de retour pour les fonctions en ligne lambda.
la source