用Python的Union简化重构

0x1 背景

        Python中的Union和其他语言的思想一样,简单理解就是多选1. 今天遇到一个问题,简单描述如下(简单示例), 目的就是name 可能有多个,希望返回多个tool.

# origin Definition
def getTool(name: str = None) -> Union[BaseTool, Dict[str, BaseTool]]:
    if name is None:
        return tools_registry._TOOLS_REGISTRY
    else:
        return tools_registry._TOOLS_REGISTRY.get(name)

# current definition
def getTool(names: List[str] = None) -> Dict[str, BaseTool]:
    if names is None:
        return tools_registry._TOOLS_REGISTRY
    else:
        tools_registry._TOOLS_REGISTRY.get(name)

# invoke
async def listTools():
    tools = getTool(names = ["Calc"])
    if tools is None: # none for all
        tools = getTool()

由于Python解释性脚本语言,本地没有测试完整,就上传了代码,结果同事的代码在某个操作后出现异常。查看后,发现很多使用这个函数的地方没有适配。

         

0x2 代码重构

发现了问题,自然要修改了。怎么修改呢? 

0x21. 逐个适配.

        每个调用地方入参都改为数组形式,然后返回结果的使用也改为数组形式的访问。改了几个后,感觉非常难看代码。数量不少,每个地方的调用方式又不一样。

0x22. 只改调用函数getTool

        是不是可以让原来的函数能够自动适应新函数接口,同时又不出错,答案是有的。

# Refactor result
def getTool(names: Union[str, List[str]] = None) -> Union[BaseTool, Dict[str, BaseTool]]:
    if names is None:
        return tools_registry._TOOLS_REGISTRY  # ret Dict 适配已存调用
    elif isinstance(names, str):
        if not names:
            raise ValueError("Tool name cannot be an empty string.")
        return tools_registry._TOOLS_REGISTRY.get(names)  # ret BaseTool 适配已存调用
    else:
        if any(not name for name in names):
            raise ValueError("Tool names cannot contain an empty string.")
        return {tool_name: tool for tool_name, tool in tools_registry._TOOLS_REGISTRY.items() if tool_name in names} # ret Dict 适配增量新的调用

 这样就保证了 已经函数无需修改和适配,节约另外很多工作量。

0x3 总结
0x31 不要基于解决问题

     遇到问题,不要急于解决, 而是先想想用什么方法解决。解决问题的方法有很多种,最好的可能只有一种。比如我们有解决方法了,可以自问一下,这样做是不是最好的,是不是最简单的(当然,扩展性等那就更多了),最好是对整体问个,是不是有更好的方式。

0x32 问问大模型        

如果有思路了,但是具体不知道怎么执行,就可以问问AI,这是个利器。任何环节,都可以让它上场试试,通常可以打开思路,比如(哈哈,别笑我蹩脚的E文啊):

  0x4 其他

       之所以把标题定位重构,我的想法是,功能不变,重写了函数。就是让一个函数不仅适配了老的调用方法和维持原来的功能,同时也能适应新的需求(一次获取多个 tool),扩展性比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值