说明
函数字典以数据库的方式管理后做到了集中存取,但是在迁移代码时要手动导入依赖函数非常烦。这里使用一个函数自动去读取(未来应该加到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都会变成一个列表