Considera lo siguiente:
def some_function():
return 1
def some_generator():
yield 1
En el código anterior, some_function
es una función, mientras que some_generator
es un generador. Se ven bastante similares.
¡El problema que tengo al leer el código es que necesito escanear cada línea en una "función" buscando la yield
palabra clave antes de poder determinar si realmente es una función o un generador!
Simplemente me parece que usar una palabra clave diferente para generadores tendría más sentido, por ejemplo:
gen some_generator():
yield 1
¿Cuáles son los méritos de usar la def
palabra clave tanto para generadores como para funciones? ¿Por qué no se ha introducido una nueva palabra clave para separar funciones y generadores?
design
programming-languages
python
Derek Kwok
fuente
fuente
gen
lugar dedef
no haría que la transformación sea significativamente más onerosa.Respuestas:
"¿Cuáles son las ventajas de utilizar la palabra clave def para generadores y funciones?"
Si bien son mecánicamente diferentes, en la práctica, cuando los uso, a menudo son efectivamente los mismos para mí conceptualmente (no pienso mucho en llamar
range()
vsxrange()
).Sin embargo, en términos de comprender de qué se trata la función rápidamente, estoy de acuerdo en que algo se pierde con el uso de
def
, pero las cosas no deberían ofuscarse demasiado dentro de la función para empezar.Incluso un implícito
return None
puede confundir el comportamiento previsto de una función después de un largo período de condicionales (como en, fue unreturn None
comportamiento final o un descuido en la lógica). Pero esas son solo mis creencias al respecto.Sin embargo, no creo que mi argumento sea particularmente convincente, por lo que me limitaré a remitirme a PEP 255 :
fuente
await
(yasync with
yasync for
construcciones sintácticas) añadidas en PEP 492 , que funcionan muy similar ayield from
, requieren la función que están acostumbrados a ser declarada usandoasync def
en lugar de un solodef
.Agregar nuevas palabras clave corre el riesgo de romper los programas existentes. Los diseñadores de idiomas generalmente intentan evitar agregar nuevas palabras clave, especialmente para las características del idioma agregadas después de que el idioma ya haya ganado cierta popularidad. Cada palabra clave que agregan es un identificador que los programas no pueden usar para otros fines, por lo que agregar una palabra clave podría romper los programas existentes. Los diseñadores de idiomas deben sopesar los beneficios de una nueva palabra clave frente a los costos.
Dudo que definir una palabra clave separada para generadores tenga muchos beneficios. Comprender si un símbolo corresponde al nombre de una función o al nombre de un generador es algo que les importa a las personas que llaman, y las personas que llaman no deberían tener que (y a veces no pueden) ver qué palabra clave se usó para implementarla. Esa es la responsabilidad de mejores convenciones de nombres y documentación.
fuente
Los generadores son funciones que evalúan perezosamente. Dado que son lo mismo en la base, tiene sentido que usen la misma palabra clave. Una opción podría ser usar un comentario para identificar cuál es cuál para una instancia dada:
fuente
Supongo que es porque es más Pythonic, pero ¿qué sé? ;)
Realmente no creo que importe tanto. Es más fácil de recordar para mí porque no es necesario memorizarlos a ambos.
EDITAR: El PEP podría decir, podría investigar allí.
fuente