Python:类似jQuery的函数链接?

Ble*_*der 8 python function chaining

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

有可能用Python链接函数,就像jQuery一样吗?

['my', 'list'].foo1(arg1, arg2).foo2(arg1, arg2).foo3(arg1, arg2) #etc...
Run Code Online (Sandbox Code Playgroud)

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

foo3(foo2(foo1(['my', 'list'], arg1, arg2), arg1, arg2), arg1, arg2) #etc...
Run Code Online (Sandbox Code Playgroud)

似乎存在一些用于创建此类功能的虚幻库,但我似乎无法理解为什么这必须如此复杂......

谢谢!

cam*_*ace 10

只要函数返回一个值,就可以链接它.在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!
Run Code Online (Sandbox Code Playgroud)

但是,你的问题似乎是你的函数参数过于狭窄.链接不是解决方案.如果要压缩函数参数,只需将参数分配给变量,然后再将它们传递给函数,如下所示:

spam = foo(arg1, arg2)
eggs = bar(spam, arg1, arg2)
ham = foobar(eggs, args)
Run Code Online (Sandbox Code Playgroud)


det*_*tly 9

这是西蒙ListMutator建议的扩展:

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
Run Code Online (Sandbox Code Playgroud)

ListMutator通过使用集合抽象基类,您可以更好地完成并使行为完全像列表.事实上,你可以将list自己子类化,虽然它可能会限制你做某些你可能需要做的事情......而且我不知道对子类化内置类型的一般意见是什么list.

  • 返回"self"的问题是,如果将它分配给另一个变量,它只是Python中的一个引用.在你的例子中.如果我们再添加`lm_two = lm`并再次执行`lm.foo1(2,0).foo2(10,0)`,我们就改变它们(`lm`和`lm_two`.最好'返回self .__ class__ (self.data)`. (2认同)