首页 > 解决方案 > 在不更改代码源的情况下重写 pywb 中的函数

问题描述

我是 python 开发的新手,我正在使用 PYWB 库来重放 Web 档案(warc 文件)。

我想修改一个函数pywb/warcserver/index但不修改代码源。

这个想法是在保留原始代码源的同时修改一些功能。在不丢失更改的情况下更新代码源将很有用。

这怎么可能在 pywb 和 python 中实现。

indexsource.py在文件中重写的函数是load_index

谢谢

标签: pythonpython-3.x

解决方案


load_indexFileIndexSource类的方法。您可以在实例级别修改方法,而无需更改库的源代码。例如:

from pywb.utils.binsearch import iter_range
from pywb.utils.wbexception import NotFoundException
from pywb.warcserver.index.cdxobject import CDXObject
from pywb.utils.format import res_template

def modified_load_index(self, params):

    filename = res_template(self.filename_template, params)

    try:
        fh = open(filename, 'rb')
    except IOError:
        raise NotFoundException(filename)

    def do_load(fh):
        with fh:
            gen = iter_range(fh, params['key'], params['end_key'])
            for line in gen:
                yield CDXObject(line)

    # (... some modification on this method)
    return do_load(fh)

# Change the "load_index" method on the instance of FileIndexSource
my_file_index_source.load_index = modified_load_index

对于 then on ,每次load_index调用my_file_index_source该方法时,都会运行修改后的方法。

另一种选择是创建一个继承FileIndexSource并覆盖该load_index方法的新类。


推荐阅读