我想在不更改源文件的情况下更改 python 中的导入函数
I would like to change an imported function in python without changing the source file
我想更改 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_ids。如有任何帮助,我们将不胜感激!
我假设您将无法从函数中提取中间值。我所能建议的就是编写您自己的函数来满足您的需要 return。这是一个例子,可能需要改进:
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, image_root, dataset_name=None, extra_annotation_keys=None):
imgs = coco_api.loadImgs(img_ids)
imgs = imgs[0:10]
然后我把函数改成如下:
detectron2.data.datasets.coco.load_coco_json = monkey
我想更改 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_ids。如有任何帮助,我们将不胜感激!
我假设您将无法从函数中提取中间值。我所能建议的就是编写您自己的函数来满足您的需要 return。这是一个例子,可能需要改进:
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, image_root, dataset_name=None, extra_annotation_keys=None):
imgs = coco_api.loadImgs(img_ids)
imgs = imgs[0:10]
然后我把函数改成如下:
detectron2.data.datasets.coco.load_coco_json = monkey