我发现functools.partial有很多很好的用例.
但是,我发现需要定义我所谓的partial_right.这就像是偏袒的,但是将“非正义”与非“k”结合起来.
我的问题是……我需要partial_right,还是我错过了什么?我可以用partial()或其他技术实现我想要的东西.
functools.partial实现如下:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
...
这是“(args fargs)”的排序,这是我的问题.这个顺序对某些目的很有用,但我发现我需要相反的顺序:
def partial_right(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
...
return func(*(fargs + args), **newkeywords)
...
一个这样的用例是当代码通过该方法上的一些装饰器构建“动态”方法时.此时不知道’self’的值:
class SomeClass(object):
@decorator(a_value, b_value)
def my_method(self, a, b):
...
在我的用例中,除了’self’之外,my_method的所有参数都是已知的.因此partial_right用于动态创建等效于:
def my_method_dynamic(self):
self.my_method(a_value, b_value)
最佳答案 对于您的特定用例,使用
operator.methodcaller
可能更合适:
import operator
my_method_dynamic = operator.methodcaller('my_method', a_value, b_value)
my_method_dynamic(obj) # calls obj.my_method(a_value, b_value)