Pythonic配方可获得更灵活的功能

2024-05-16 06:29:36 发布

您现在位置:Python中文网/ 问答频道 /正文

内置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中似乎没有这样的咖喱内置代码,所以我猜有一种配方涉及到其他内置代码来处理它

有人知道这个秘密吗


Tags: orof参数returnfooisdefpartial
1条回答
网友
1楼 · 发布于 2024-05-16 06:29:36

Python不是函数式编程语言;它是一种多范式语言,对一些有限的函数式编程技术有一定的支持。如果您想对函数的第二个位置参数进行部分应用,我怀疑标准库中是否有支持“开箱即用”的内容。您可以编写自己的助手函数,如下所示:

def partial_second(f, y):
    def partial_f(x, *vargs, **kwargs):
        return f(x, y, *vargs, **kwargs)
    return partial_f

is_string = partial_second(isinstance, str)

但我只建议在您经常需要做这种咖喱的情况下才这样做,在这种情况下,您可能不会编写惯用Python。根据Zen of Python,“显式优于隐式”和“简单优于复杂”,因此,您可以这样编写,而不是使用局部应用程序,而不是使用curry:

def is_string(x):
    return isinstance(x, str)

相关问题 更多 >