首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bonobo中使用@use装饰器

在bonobo中使用@use装饰器
EN

Stack Overflow用户
提问于 2020-09-23 16:46:21
回答 1查看 159关注 0票数 1

在bonobo文档中,它们有以下配置服务依赖关系的示例:

代码语言:javascript
复制
from bonobo.config import use
@use('orders_database')
def select_all(database):
yield from database.query('SELECT * FROM foo;')

我试着做一些类似的事情,结果出了一个错误。下面是我的脚本的一个非常简化的版本:

代码语言:javascript
复制
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))

如果我尝试运行这个程序,我会得到以下错误:

CRITICAL:bonobo.execution.contexts.base:跟踪(最近一次调用):文件"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\config\processors.py",行102,在 call 绑定= self._bind(_input)文件"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\config\processors.py",行89中,在_bind返回绑定(*self.args)中文件"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\inspect.py",行3015,在绑定返回args._bind(args1:,kwargs)文件"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\inspect.py",第2930行,在“无"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\execution\contexts\node.py",:缺少一个必需的参数”的_bind raise (Msg)中:“ftp”上述异常是以下异常的直接原因:跟踪(最近一次调用):文件self.step第102行,循环self.step()文件"C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\execution\contexts\node.py",第129行,在step = self._stack(input_bag) File 第114行中,来自exc bonobo.errors.UnrecoverableTypeError的call:的输入不绑定到节点签名。Args:()输入:() Kwargs:{‘ftp 1’:}签名:(ftp)

让它运行的唯一方法是在ftp1函数中将ftp更改为listen_for_file。我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-24 02:11:51

bonobo对变量命名有严格的要求--尽管它不应该。

要使用config.use,最好在函数签名中使用确切的服务名称,并将其保留为最后一个参数。

要更改要使用的实际服务提供者,需要更改get_services函数中的映射。

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64032630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档