kanadeblisst00 / wechat_ocr

使用Python调用微信本地ocr服务
190 stars 55 forks source link

回调函数可变参数扩展 #3

Closed NOBB2333 closed 5 months ago

NOBB2333 commented 6 months ago

下面这段代码中 ocr_result_callback 似乎没有办法设置 传参数量,默认一个 img_path 一个 result_json 没找到在哪改

def main():
    ocr_manager = OcrManager(wechat_dir)
    # 设置WeChatOcr目录
    ocr_manager.SetExePath(wechat_ocr_dir)
    # 设置微信所在路径
    ocr_manager.SetUsrLibDir(wechat_dir)
    # 设置ocr识别结果的回调函数
    ocr_manager.SetOcrResultCallback(ocr_result_callback)

def ocr_result_callback(img_path:str, result_json:str, **args):
    result_json = EasyDict(result_json)

找到

    def CallUsrCallback(self, request_id:c_uint32, serialized_data: c_void_p, data_size: int):
        ocr_response_ubyte = (c_ubyte * data_size).from_address(serialized_data)
        ocr_response_array = bytearray(ocr_response_ubyte)
        ocr_response = ocr_protobuf_pb2.OcrResponse()
        ocr_response.ParseFromString(ocr_response_array)
        json_response_str = MessageToJson(ocr_response)
        task_id = ocr_response.task_id
        if not self.m_id_path.get(task_id):
            return
        #print(f"收到识别结果, task_id: {task_id}, result: {json_response}")
        pic_path = self.m_id_path[task_id]
        if self.m_usr_callback:
            self.m_usr_callback(pic_path, self.parse_json_response(json_response_str))
        self.SetTaskIdIdle(task_id)

self.m_usr_callback(pic_path, self.parse_json_response(json_response_str)) 改为 在初始化时候传参,不是源码里传参 能否改为 def test_kwargs(first, *args, **kwargs): 这样类型 目前个人是使用 ,**kwargs 但是还是不能传参,能否增加返回值的功能,就可以不使用全局变量来保存了

def ocr_result_callback(img_path:str, result_json:str,  www=1):
    result_json = EasyDict(result_json)
kanadeblisst00 commented 6 months ago

我没太看明白你后面发的那一段话,如果只是为了回调函数可以指定任意个参数的话,实现很简单:你可以修改OcrManager类的__init__方法,增加**kwargs。然后方法里加一行self.kwargs = kwargs

接着在self.m_usr_callback(pic_path, self.parse_json_response(json_response_str))改成self.m_usr_callback(pic_path, self.parse_json_response(json_response_str), **self.kwargs)

另外如果你只是不想定义全局变量的话,也不想修改源码的话,可以使用闭包的形式来定义回调函数:

def ocr_result_callback_pack(*args, **kwargs):
    def _ocr_result_callback(img_path:str, result_json:str):
        print(img_path, result_json)
        print(args)
        print(kwargs)

    return _ocr_result_callback

ocr_result_callback = ocr_result_callback_pack("aaaaaaaa", a=1, b=2)

ocr_result_callback就是需要的回调函数,"aaaaaaaa", a=1, b=2则是你原先需要定义成全局变量的变量

NOBB2333 commented 6 months ago

不好意思,我的表述可能不是很精准,我想表述的问题是: 回调函数在外部输入,但是传参是在源码中传参,这就限制了回调函数的输入传参只有 img_path:str, result_json:str, 这样似乎设计不太合理🤣

您这个闭包/装饰器传参确实可以解决这个问题,也是解决方案,理解了

kanadeblisst00 commented 6 months ago

不,这样设计才合理。不然你猜它为什么叫回调函数,就是要限制我给什么,你拿什么。而不是你要什么我给什么。

NOBB2333 commented 6 months ago

哈哈哈哈,理解了