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)
这是西蒙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.