Recientemente noté algo interesante al mirar la especificación gramatical de Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
El bloque opcional 'flecha' estaba ausente en Python 2 y no pude encontrar ninguna información sobre su significado en Python 3. Resulta que este es Python correcto y es aceptado por el intérprete:
def f(x) -> 123:
return x
Pensé que esto podría ser algún tipo de sintaxis previa, pero:
- No puedo probar
x
aquí, todavía no está definido, - No importa lo que ponga después de la flecha (p
2 < 1
. Ej. ), No afecta el comportamiento de la función.
¿Podría alguien acostumbrado a esta sintaxis explicarlo?
.__annotations__
atributo.__annotations__
atributo es un diccionario. La clavereturn
es la utilizada para recuperar el valor después de la flecha.Estas son anotaciones de funciones cubiertas en PEP 3107 . Específicamente,
->
marca la anotación de la función de retorno.Ejemplos:
Las anotaciones son diccionarios, por lo que puede hacer esto:
También puede tener una estructura de datos de Python en lugar de solo una cadena:
O puede usar atributos de función para validar los valores llamados:
Huellas dactilares
fuente
Como han dicho otras respuestas, el
->
símbolo se usa como parte de las anotaciones de funciones. Sin>= 3.5
embargo, en versiones más recientes de Python , tiene un significado definido .PEP 3107 - Las anotaciones de funciones describieron la especificación, definieron los cambios gramaticales, la existencia
func.__annotations__
en la que están almacenados y el hecho de que su caso de uso aún está abierto.Sin
3.5
embargo, en Python , PEP 484 - Type Hints le da un significado único a esto:->
se usa para indicar el tipo que devuelve la función. También parece que esto se aplicará en futuras versiones como se describe en Qué hay de los usos existentes de las anotaciones :(El énfasis es mío)
Esto no se ha implementado realmente
3.6
hasta donde puedo decir, por lo que podría verse afectado en futuras versiones.De acuerdo con esto, el ejemplo que ha proporcionado:
estará prohibido en el futuro (y en las versiones actuales será confuso), debería cambiarse a:
para que describa efectivamente esa función
f
devuelve un objeto de tipoint
.Las anotaciones no son utilizadas de ninguna manera por Python en sí, sino que las llena e ignora. Depende de las bibliotecas de terceros trabajar con ellas.
fuente
En el siguiente código:
el
-> int
solo dice quef()
devuelve un entero (pero no obliga a la función a devolver un entero). Se denomina anotación de retorno y se puede acceder comof.__annotations__['return']
.Python también admite anotaciones de parámetros:
: float
le dice a las personas que leen el programa (y algunas bibliotecas / programas de terceros, por ejemplo, pylint) quex
deberían ser afloat
. Se accede comof.__annotations__['x']
, y no tiene ningún significado en sí mismo. Vea la documentación para más información:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
fuente
Esto significa el tipo de resultado que devuelve la función, pero puede ser
None
.Está muy extendido en las bibliotecas modernas orientadas a Python 3.x.
Por ejemplo, existe en el código de la biblioteca pandas-perfiles en muchos lugares, por ejemplo:
fuente
def function(arg)->123:
Es simplemente un tipo de retorno, entero en este caso no importa qué número escriba.
como Java :
Pero para Python (como dijo Jim Fasarakis Hilliard ) el tipo de retorno es solo una pista , por lo que sugiere el retorno pero permite de todos modos devolver otro tipo como una cadena ...
fuente
Mi resumen:
Simplemente
->
se presenta para que los desarrolladores especifiquen opcionalmente el tipo de retorno de la función. Ver la propuesta de mejora de Python 3107Esta es una indicación de cómo se pueden desarrollar las cosas en el futuro a medida que Python se adopte ampliamente, una indicación hacia una escritura fuerte, esta es mi observación personal.
También puede especificar tipos para argumentos. Especificar el tipo de retorno de las funciones y argumentos ayudará a reducir los errores lógicos y mejorar las mejoras de código.
Puede tener expresiones como tipo de retorno (tanto a nivel de función como de parámetro) y se puede acceder al resultado de las expresiones a través del atributo 'return' del objeto de anotaciones . las anotaciones estarán vacías para el valor de expresión / retorno para las funciones en línea lambda.
fuente