Python 函数字典系列4-自动读取程序中的依赖

本文介绍了一种Python程序中自动解析函数依赖的方法,通过遍历查找所有被调用的函数名称,实现对依赖函数的自动加载,提高了代码迁移效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

函数字典以数据库的方式管理后做到了集中存取,但是在迁移代码时要手动导入依赖函数非常烦。这里使用一个函数自动去读取(未来应该加到FuncDict的下一个版本中)

内容

结果如下:输入一段py程序,程序逐层搜索,找到所依赖的所有函数

# 根据给定的某个待执行程序文本,自动解析出需要加载的函数
def extract_depend_funcname_list(some_py_txt,start='fs.' , end='\(', cur_func_dict =None, fs=None,iter_max = 1000):
    # 1 初始步
    cur_func_list = fs.re_extrace_between2(some_py_txt, 'fs.', '\(').split(',')
    
    
    # 2 迭代
    res_list = []
    iter_cnt = 0
    while  iter_cnt < iter_max :
        print(iter_cnt)
        iter_cnt +=1 
        if len(cur_func_list) ==0:
            print('[Q] 没有需要搜索的函数,退出')
            break 
        # 开始逐次迭代

        # 本轮迭代的结果
        new_func_list = []

        # 本轮迭代的主体
        for funcname in cur_func_list:
            print(funcname)
            res_list.append(funcname)
            some_func_body = cur_func_dict.opr_get_one('rule_name', funcname)['data']

            if len(some_func_body):
                # 单个字符split也会再次变为列表
                tem_new_func_list = fs.re_extrace_between2(some_func_body, 'fs.', '\(').split(',')
                new_func_list += [x for x in tem_new_func_list if len(x) > 1]
        cur_func_list = fs.get_list_gap(new_func_list,res_list)
    return res_list 

例子,注意输入的文本是要有函数的调用形式(小括号的)。本质上使用正则寻找fs.开头和小括号结尾的中间字符(非贪婪),然后使用BFS逐层搜索,并拆掉环。

extract_depend_funcname_list('fs.ner_batch_predict()',cur_func_dict=cur_func_dict, fs = fs )
---
0
ner_batch_predict
1
inv_convert_chinese_word_tag_list2BIO
zip_files_by_step
2
slice_list_by_batch
zip_a_folder4
3
[Q] 没有需要搜索的函数,退出
['ner_batch_predict',
 'inv_convert_chinese_word_tag_list2BIO',
 'zip_files_by_step',
 'slice_list_by_batch',
 'zip_a_folder4']

找到依赖的函数后,可以这样:

# 依赖函数列表
depend_list = ['unzip_a_folder','rulev002_check_pkl_files','get_list_gap',
              'rulev002_ner_predict_pkl_files','ner_batch_predict',
              'inv_convert_chinese_word_tag_list2BIO','rulev002_ner_merge_predict_result',
              'rulev002_ner_predict_report']
for the_func in depend_list:
    cur_func_dict.dynamic_load_func_db(the_func, method='auto')

通常在这种情况下使用auto就可以了,如果函数有修改才用force,避免创建无用的文件。

其他的小发现:

  • 1 任何字符的split都会变成一个列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值