内置python提供了functools.partial
用于咖喱,但仅此一项就相当有限。
我的猜测是,还有其他内置的与partial
的组合将克服这些限制。它们是什么
举几个例子
我可以这样做:
asdf_is_instance_of = partial(isinstance, 'asdf')
assert asdf_is_instance_of(str)
但我不能这样做(可以说是更经常有用的东西):
isinstance_of_str = partial(isinstance, class_or_tuple=str)
isinstance_of_str('asdf')
因为isinstance() takes no keyword arguments
这是一种限制:无法通过partial
直接绕过参数种类限制。在这种情况下,我们可以:
def my_isinstance(obj, class_or_tuple): # just to get rid of position only parameter kinds
return isinstance(obj, class_or_tuple)
isinstance_of_str = partial(my_isinstance, class_or_tuple=str)
assert isinstance_of_str('asdf') # now it works
还有一个常见的限制:参数顺序。
可以编写一个partial_ext
来处理参数的种类和顺序。这个咖喱功能是这样的
def foo(x,y,z):
return x + y * z
xz_foo_with_y_equal_228 = partial_ext(foo, y=228)
相当于
def xz_foo_with_y_equal_228(x, y, z):
return foo(x, y=228, z)
python中似乎没有这样的咖喱内置代码,所以我猜有一种配方涉及到其他内置代码来处理它
有人知道这个秘密吗
Python不是函数式编程语言;它是一种多范式语言,对一些有限的函数式编程技术有一定的支持。如果您想对函数的第二个位置参数进行部分应用,我怀疑标准库中是否有支持“开箱即用”的内容。您可以编写自己的助手函数,如下所示:
但我只建议在您经常需要做这种咖喱的情况下才这样做,在这种情况下,您可能不会编写惯用Python。根据Zen of Python,“显式优于隐式”和“简单优于复杂”,因此,您可以这样编写,而不是使用局部应用程序,而不是使用curry:
相关问题 更多 >
编程相关推荐