我想在python中更改导入的函数而不更改源文件

问题描述

我想在 python 中更改导入的函数,但实际上不知道从哪里开始或如何执行此操作.. 我以前见过装饰器和钩子,但不确定这是否是解决问题的正确方法

基本上我想改变的功能如下:

def load_coco_json(json_file,image_root,dataset_name=None,extra_annotation_keys=None):

这个函数做了很多事情,但我感兴趣的是

img_ids = sorted(coco_api.imgs.keys())

我想添加某种装饰器来完成以下操作:

img_ids = sorted(coco_api.imgs.keys())
img_ids = img_ids[0:20]

基本上,从我的处理笔记本中,我希望能够定义在此 load_coco_json 函数中使用了多少个 img_id。任何帮助将不胜感激!

解决方法

我假设您将无法从函数中提取中间值。我只能建议编写您自己的函数,该函数将返回您需要的内容。这是一个例子,可能需要改进:

from pycocotools.coco import COCO
import contextlib
from detectron2.utils.file_io import PathManager
import io


def my_func(json_file):
    json_file = PathManager.get_local_path(json_file)
    with contextlib.redirect_stdout(io.StringIO()):
        coco_api = COCO(json_file)
        img_ids = sorted(coco_api.imgs.keys())
        return img_ids
,

好吧,基本上,我修补了它。

从load_coco_json复制整个函数:

def load_coco_json(json_file,image_root,dataset_name=None,extra_annotation_keys=None):
    imgs = coco_api.loadImgs(img_ids)

然后我重命名它并应用补丁

def monkey(json_file,extra_annotation_keys=None):
    imgs = coco_api.loadImgs(img_ids)
    imgs = imgs[0:10]

然后我把函数改成如下:

detectron2.data.datasets.coco.load_coco_json = monkey