Python 在倭黑猩猩中使用@use装饰器
在bonobo文档中,他们有以下配置服务依赖关系的示例:Python 在倭黑猩猩中使用@use装饰器,python,python-decorators,bonobo-etl,Python,Python Decorators,Bonobo Etl,在bonobo文档中,他们有以下配置服务依赖关系的示例: from bonobo.config import use @use('orders_database') def select_all(database): yield from database.query('SELECT * FROM foo;') 我试着做类似的事情,结果出错了。下面是我的脚本的一个非常简化的版本: import bonobo from bonobo.config import use from ftplib i
from bonobo.config import use
@use('orders_database')
def select_all(database):
yield from database.query('SELECT * FROM foo;')
我试着做类似的事情,结果出错了。下面是我的脚本的一个非常简化的版本:
import bonobo
from bonobo.config import use
from ftplib import FTP
def get_services(**options):
ftp_1 = FTP('ftp.gnu.org')
ftp_1.login()
ftp_1.cwd('gnu/emacs')
return{
'ftp1': ftp_1,
}
@use('ftp1')
def listen_for_file(ftp):
test = ftp.nlst('README.olderversions')
if test:
print( 'Found file')
return True
else:
print('File not found in ftp')
return False
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(listen_for_file)
return graph
if __name__ == '__main__':
parser = bonobo.get_argument_parser()
with bonobo.parse_args(parser) as options:
bonobo.run(get_graph(**options), services=get_services(**options))
如果尝试运行此操作,则会出现以下错误:
关键:bonobo.execution.contexts.base:
回溯(最近一次呼叫最后一次):
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site packages\bonobo\config\processors.py”,第102行,在调用中
绑定=自绑定(\u输入)
文件“C:\Users\mfrants\AppData\Local\Programs\Python\37\lib\site packages\bonobo\config\processors.py”,第89行,在绑定中
返回绑定(*self.args,*\u输入,**self.kwargs)
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\inspect.py”,第3015行,在bind中
返回args[0]。\u绑定(args[1:],kwargs)
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\inspect.py”,第2930行,在绑定中
从“无”引发类型错误(msg)
TypeError:缺少必需的参数:“ftp”
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site packages\bonobo\execution\contexts\node.py”,循环中的第102行
self.step()
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site packages\bonobo\execution\contexts\node.py”,第129行,步骤
结果=自身堆栈(输入包)
文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site packages\bonobo\config\processors.py”,第114行,在调用中
)来自exc
bonobo.errors.UnrecoverableTypeError:的输入未绑定到节点签名。
Args:()
输入:()
Kwargs:{'ftp1':}
签名:(ftp)
我能让它运行的唯一方法是在listen_for_file函数中将ftp更改为ftp1。我在这里做错了什么?bonobo对变量命名很严格,尽管不应该这样 要使用
config.use
,最好在函数签名中使用确切的服务名称,并将其保留为最后一个参数
要更改您想要使用的实际服务提供商,您需要在get\u services
功能中更改地图
import bonobo
from bonobo.config import use
from ftplib import FTP
def get_services(**options):
ftp_1 = FTP(options.get('ftp_server') or 'ftp.gnu.org')
ftp_1.login()
ftp_1.cwd('gnu/emacs')
return{
'ftp': ftp_1,
}
@use('ftp')
def listen_for_file(ftp):
test = ftp.nlst('README.olderversions')
if test:
print( 'Found file')
return True
else:
print('File not found in ftp')
return False
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(listen_for_file)
return graph
if __name__ == '__main__':
parser = bonobo.get_argument_parser()
parser.add('--ftp_server')
with bonobo.parse_args(parser) as options:
bonobo.run(get_graph(**options), services=get_services(**options))
>我能让它运行的唯一方法是在listen_for_file函数中将ftp更改为ftp1。是的,这听起来很有道理。因为引用名称应该与我的想法相同。@FonyLew,那么它是否按预期工作?因为我从文档页面引用的示例有不同的名称(“使用装饰器中的orders\u database”和函数定义中的“database”)。谢谢,@PyGuy,这就是我想要它做的。