В Python считается ли это лучшим стилем для:
- явного определения полезных функций в терминах более общих, возможно, внутреннего использования, функций;или
- использовать приложение с частичной функцией для явного описания функции каррирования?
Я объясню свой вопрос в надуманном примере.
Предположим, кто-то пишет функцию, _sort_by_scoring, который принимает два аргумента: функцию оценки и список элементов.Он возвращает копию исходного списка, отсортированного по оценкам на основе позиции каждого элемента в исходном списке.Предоставляются также две примерные функции оценки:
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
Функция _sort_by_score никогда не вызывается напрямую;вместо этого он вызывается другими функциями с одним аргументом, которые передают функцию оценки и свой единственный аргумент (список элементов) в _sort_by_scoring и возвращают результат.
# 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)
Очевидно, что это намерение лучше выражается вусловия каррирования функций.
# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)
Использование (в любом случае):
>>> foo = [1, 2, 3, 4, 5]
>>> identity_ordering(foo)
[1, 2, 3, 4, 5]
>>> reversed_ordering(foo)
[5, 4, 3, 2, 1]
Очевидные преимущества стиля явного определения функции:
- полезные функциимогут быть определены до более общих функций, без вызова NameErrors;
- вспомогательные функции (например, функции скоринга) могут быть определены в теле определения функции;
- возможно легче отладить;
- код выглядит хорошо благодаря тому, что «явное лучше, чем неявное».
Очевидные преимущества стиля определения функции с карри:
- выражает намерение функционального программирования идиоматически;
- код выглядит красиво благодаря краткости.
Для определения "полезных" функций, которые изон два стиля предпочтительнее?Есть ли другие стили, более идиоматические / Pythonic / и т. Д.?