Python 在倭黑猩猩中使用@use装饰器

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

在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 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,这就是我想要它做的。