我在谷歌上找不到关于这个主题的任何内容,所以我想我应该在这里问一下:
有可能用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)
似乎存在一些用于创建此类功能的虚幻库,但我似乎无法理解为什么这必须如此复杂......
谢谢!
我想实现方法链接,但不是通常的函数 - 对于asyncio协同程序.
import asyncio
class Browser:
@asyncio.coroutine
def go(self):
# some actions
return self
@asyncio.coroutine
def click(self):
# some actions
return self
Run Code Online (Sandbox Code Playgroud)
调用链的"直观"方式不起作用,因为单个方法返回coroutine(生成器),而不是self:
@asyncio.coroutine
def main():
br = yield from Browser().go().click() # this will fail
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)
正确的呼叫链方式是:
br = yield from (yield from Browser().go()).click()
Run Code Online (Sandbox Code Playgroud)
但它看起来很难看,并且在链条增长时变得难以理解.
有没有办法做得更好?欢迎任何想法.
我确实有一堂课:
class BaseModel:
def __init__(self):
pass
def read_data(self):
df = ...
return df
def transform_input(self, df):
df = ...
return df
def execute(self, df):
df = ...
return df
def run(self):
data = self.read_data()
data = self.transform_input(data)
data = self.execute(data)
Run Code Online (Sandbox Code Playgroud)
如何避免这些方法相继调用?是否可以这样做:
data = self.read_data().transform_input().execute()
Run Code Online (Sandbox Code Playgroud)
?
是否可以以某种方式链接这些方法并解决在此方法链中传递参数(数据)的问题?