在Python,它被认为是更好的风格:在Python,部分功能的应用程序(柯里)对明确的函数定义
- 在更一般的,可能内部使用,功能方面明确定义有用的功能;或者,
- 使用部分函数应用程序来明确描述函数currying?
我会通过一个人为的例子来解释我的问题。
假设有人写了一个函数_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)
显然,这个意图可以用函数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)
使用(在任一情况下):
>>> foo = [1, 2, 3, 4, 5]
>>> identity_ordering(foo)
[1, 2, 3, 4, 5]
>>> reversed_ordering(foo)
[5, 4, 3, 2, 1]
的显函数定义风格的明显的优点:更一般的功能是之前
- 有用的功能可以被定义,不提高NameErrors;
- 辅助函数(例如评分函数)可以在函数定义体内定义;
- 可能更容易调试;
- 代码由于“显式优于隐式”而看起来不错。
的咖喱功能定义风格明显的优点:
- 表示惯用函数式编程的意图;
- 代码由于简洁而看起来不错。
要定义“有用”的功能,哪种风格是首选?还有其他更习惯/ Pythonic /等风格吗?
一个侧面说明,柯里和部分应用两种不同的东西。柯里意味着一次转换函数来工作一个参数。所以当你应用第一个参数时,你得到的是一个函数,然后你可以应用第二个参数。部分应用程序只是修复一些参数到函数调用 – PuercoPop 2013-04-12 18:23:42