En Python, se considera mejor estilo a:En Python, aplicación de función parcial (currificación) versus definición de función explícita
- definir explícitamente funciones útiles en términos de, el uso posiblemente interna más general, las funciones; o,
- ¿utiliza la aplicación de función parcial para describir explícitamente el currying de función?
Explicaré mi pregunta por medio de un ejemplo artificial.
Supongamos que se escribe una función, _sort_by_scoring, que toma dos argumentos: una función de puntuación y una lista de elementos. Devuelve una copia de la lista original ordenada por puntajes según la posición de cada elemento dentro de la lista original. También se proporcionan dos ejemplos de funciones de puntuación.
def _sort_by_score(scoring, items_list):
unsorted_scored_list = [(scoring(len(items_list), item_position), item) for item_position, item in enumerate(items_list)]
sorted_list = [item for score, item in sorted(unsorted_scored_list)]
return sorted_list
def _identity_scoring(items_list_size, item_position):
return item_position
def _reversed_scoring(items_list_size, item_position):
return items_list_size - item_position
La función _sort_by_score nunca se llama directamente; en su lugar, es llamado por otras funciones de argumento único que pasan una función de puntuación y su único argumento (una lista de elementos) a _sort_by_scoring y devuelve el resultado.
# Explicit function definition style
def identity_ordering(items_list):
return _sort_by_score(_identity_scoring, items_list)
def reversed_ordering(items_list):
return _sort_by_score(_reversed_scoring, items_list)
Obviamente, esta intención se expresa mejor en términos de función de currying.
# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)
Uso (en cualquier caso):
>>> foo = [1, 2, 3, 4, 5]
>>> identity_ordering(foo)
[1, 2, 3, 4, 5]
>>> reversed_ordering(foo)
[5, 4, 3, 2, 1]
ventajas aparentes del estilo función definición explícita:
- funciones útiles pueden ser definidos antes de que las funciones más generales son, sin levantar NameErrors;
- funciones auxiliares (por ejemplo, funciones de puntuación) podrían definirse dentro del cuerpo de definición de función;
- posiblemente más fácil de depurar; código
- se ve bien en virtud de "explícita es mejor que implícita".
ventajas aparentes de estilo definición de función al curry:
- expresa la intención de la programación funcional idiomático; código
- se ve bien en virtud de la concisión.
Para definir las funciones "útiles", ¿cuál de los dos estilos se prefiere? ¿Hay otros estilos que sean más idiomáticos/Pythonic/etc.?
una nota al margen, currying y aplicación parcial son dos cosas diferentes. Currying implica transformar la función para trabajar un argumento a la vez. Entonces cuando aplicas el primer argumento obtienes una función que luego puedes aplicar el segundo argumento. La aplicación parcial solo está arreglando algunos parámetros para la invocación de la función – PuercoPop