在Python中,是否认为更好的样式是:明确定义有用的函数,使其更通用,可能是内部使用;或者
使用部分函数应用程序显式描述函数curring?
我将用一个捏造的例子来解释我的问题。
假设有人编写了一个函数�sort�by�u scoring,它接受两个参数: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_score并返回结果。# 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)
显然,这个意图最好用函数curring来表达。# 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]
显式函数定义样式的明显优点:有用的函数可以在更一般的函数之前定义,而不会引起命名错误
帮助函数(例如,评分函数)可以在函数定义体中定义
可能更容易调试
由于“显式优于隐式”,代码看起来不错
当前函数定义样式的明显优势:习惯地表达函数式编程的意图
代码简洁,看起来不错。
为了定义“有用的”函数,两种样式中哪一种是首选的?有没有其他的风格更像是惯用的/Python式的/等等。?