修改
我的原始问题似乎有缺陷;正如KillianDS和jonrsharpe所指出的那样,key
与cmp
混淆了。使用cpm
和我的类callable按预期工作。
我接受了jonrsharpe的回答,因为它是“如何使用数据播种函数”的更正确答案。
原始问题
是否可以在将函数传递给Python的sorted(list, key=comp)
函数之前使用数据预先设定种子?
我尝试过创建一个可调用的类,如下所示:
class MyComp(object):
def __init__(self, data):
self.data = data
def __call__(self, a, b):
# compares `a` with `b`, optionally using `data`
sortfunc = MyComp(True)
sorted(mylist, key=sortfunc)
然而,当我尝试这个时,我得到一个TypeError
:
TypeError: __call__() takes exactly 3 arguments (2 given)
我也试过一个包装函数:
def my_comp(data):
def comp(a, b):
...
return comp
sortfunc = my_comp(True)
sorted(mylist, key=sortfunc)
但是TypeError
也失败了,尽管不同:
TypeError: comp() takes exactly 2 arguments (1 given)
有什么方法可以达到我想要的结果吗?
答案 0 :(得分:4)
在一般情况下,要定义一些在调用时传递给函数的参数,可以使用functools.partial
:
>>> from functools import partial
>>> def f(x, y):
return x + y
>>> g = partial(f, y=2)
>>> g(3) # x=3, y=2
5
在这种情况下,请注意key
sorted
仅使用单个参数调用 - 使用{{1}为mylist
中的每个项生成一个值然后,列表将根据这些值进行排序。它不是用成对的项目来调用的;那是key
(见the docs)。