覆盖后,bonobo方法失败

时间:2018-03-28 22:35:48

标签: python override bonobo-etl

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

def writer_factory(self, file):
        return csv.writer(file, **self.get_dialect_kwargs()).writerow

与文档:

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文件,所以我尝试覆盖它:

class quoCsvWriter(bonobo.CsvWriter):    
def writer_factory(self, file):
            return csv.writer(file, **self.get_dialect_kwargs(),quoting=csv.QUOTE_NONNUMERIC).writerow

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

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'

任何提示都表示赞赏。

更新

同时我试着做

bonobo.CsvWriter('filename.csv',quoting=csv.QUOTE_MINIMAL)

它抛出错误:

TypeError  "quoting" must be an integer

1 个答案:

答案 0 :(得分:2)

从bonobo 0.6开始,直接覆盖子类中的Method实例并非易事。相反,您应该在构造函数参数中提供重写实现。

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()方法来实现:

@use_context
class QuoteNonNumericCsvWriter(bonobo.CsvWriter):
    def get_dialect_kwargs(self):
        return {
            **super().get_dialect_kwargs(),
            'quoting': csv.QUOTE_NONNUMERIC,
        }

这应该按预期工作。

当然,从bonobo 0.6.2开始,可以直接从编写器构造函数覆盖quoting,之前有一个错误,但现在修复了。

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

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

希望有所帮助。