类似jQuery的函数链接?

2024-04-18 13:35:47 发布

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

我在谷歌上找不到关于这个主题的任何东西,所以我想我应该在这里问一下:

可以像jQuery那样用Python链接函数吗?

['my', 'list'].foo1(arg1, arg2).foo2(arg1, arg2).foo3(arg1, arg2) #etc...

当我写这段代码时,我失去了很多空间和可读性:

foo3(foo2(foo1(['my', 'list'], arg1, arg2), arg1, arg2), arg1, arg2) #etc...

似乎有一些虚幻的图书馆为创造这样的功能,但我似乎不明白为什么这必须如此复杂的外观。。。

谢谢!


Tags: 函数代码主题链接myetc空间jquery
3条回答

如果我们讨论的是对象方法,那么它很简单,只需要从每个方法中return self。另一方面,如果你想链接未绑定的函数,我真的没有必要按你想的方式链接它们。当然,它看起来不错,但是它在语义上不连贯,因为“.”代表对象属性访问,而不是“链”。

以下是西蒙建议的扩展:

class ListMutator(object):

    def __init__(self, seq):
        self.data = seq

    def foo1(self, arg1, arg2):
        self.data = [x + arg1 for x in self.data]
        # This allows chaining:
        return self

    def foo2(self, arg1, arg2):
        self.data = [x*arg1 for x in self.data]
        return self

if __name__ == "__main__":
    lm = ListMutator([1,2,3,4])
    lm.foo1(2, 0).foo2(10, 0)
    print lm.data

    # Or, if you really must:
    print ListMutator([1,2,3,4]).foo1(2, 0).foo2(10, 0).data

通过使用collections abstract base classes,可以更好地使ListMutator完全像一个列表。事实上,您可以对list本身进行子类划分,尽管它可能会限制您执行某些可能需要执行的操作。。。我也不知道对内置类型(比如list)进行子类化的一般看法。

只要函数返回一个值,就可以将其链接起来。在jQuery中,选择器方法通常返回选择器本身,这就是允许您进行链接的原因。如果要在python中实现链接,可以执行以下操作:

class RoboPuppy:

  def bark(self):
    print "Yip!"
    return self

  def growl(self):
    print "Grr!"
    return self

pup = RoboPuppy()
pup.bark().growl().bark()  # Yip! Grr! Yip!

但是,您的问题似乎是您的函数参数太窄。连锁不是解决这个问题的办法。如果要压缩函数参数,只需在将参数传递给函数之前将其分配给变量,如下所示:

spam = foo(arg1, arg2)
eggs = bar(spam, arg1, arg2)
ham = foobar(eggs, args)

相关问题 更多 >