首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bonobo方法在越位后失败

bonobo方法在越位后失败
EN

Stack Overflow用户
提问于 2018-03-28 22:35:47
回答 1查看 151关注 0票数 1

我正在使用一个名为bonobo的轻型ETL库。csv编写器bonobo.CsvWriter类有一个工厂方法:

代码语言:javascript
复制
def writer_factory(self, file):
        return csv.writer(file, **self.get_dialect_kwargs()).writerow

与医生:

代码语言:javascript
复制
class CsvWriter(FileWriter, CsvHandler):
    @Method(
        __doc__='''
            Builds the CSV writer, a.k.a an object we can pass a field collection to be written as one line in the
            target file.

            Defaults to builtin csv.writer(...).writerow, but can be overriden to fit your special needs.
        '''
    )

我想添加一些额外的参数来自定义我的csv文件,所以我尝试以这样的方式覆盖它:

代码语言:javascript
复制
class quoCsvWriter(bonobo.CsvWriter):    
def writer_factory(self, file):
            return csv.writer(file, **self.get_dialect_kwargs(),quoting=csv.QUOTE_NONNUMERIC).writerow

当我将节点添加到链中时,程序显示:

代码语言:javascript
复制
Traceback (most recent call last):
  File "geocoding.py", line 162, in <module>
    get_graph(),
  File "geocoding.py", line 135, in get_graph
    quoCsvWriter('db_addresses.csv')
  File "/Users/xxxx/xxxx/lib/python3.6/site-packages/bonobo/config/configurables.py", line 152, in __new__
    missing.remove(name)
KeyError: 'writer_factory'

如有任何提示,将不胜感激。

更新:

同时当我试着去做

代码语言:javascript
复制
bonobo.CsvWriter('filename.csv',quoting=csv.QUOTE_MINIMAL)

它抛出错误:

代码语言:javascript
复制
TypeError  "quoting" must be an integer
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 10:01:27

从bonobo 0.6开始,在子类中直接重写方法实例是非常重要的。相反,您应该在构造函数参数中提供一个覆盖的实现。

代码语言:javascript
复制
def writer_factory(self, file):
    return csv.writer(file, **{**self.get_dialect_kwargs(), 'quoting': csv.QUOTE_NONNUMERIC}).writerow

def get_graph(**options):
    graph = bonobo.Graph()
    graph.add_chain(
      extract,
      bonobo.CsvWriter('...', writer_factory=writer_factory),

    )

    return graph

如果您确实希望为该用例创建子类,则可以通过重写get_dialect_kwargs()方法来实现:

代码语言:javascript
复制
@use_context
class QuoteNonNumericCsvWriter(bonobo.CsvWriter):
    def get_dialect_kwargs(self):
        return {
            **super().get_dialect_kwargs(),
            'quoting': csv.QUOTE_NONNUMERIC,
        }

这应如预期的那样起作用。

当然,可以直接从编写器构造函数(如bonobo0.6.2)重写quoting,在此之前存在一个bug,但现在fix已经发布。

代码语言:javascript
复制
def get_graph(**options):
    graph = bonobo.Graph()
    graph.add_chain(
      extract,
      bonobo.CsvWriter('...', quoting=csv.QUOTE_NONNUMERIC),
    )

这三种方法都有完全相同的行为,你应该赞成最后一种。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49545257

复制
相关文章

相似问题

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