Bash脚本内嵌Python代码对函数信息元组列表排序失效问题求助
问题分析与解决
你遇到的排序无效问题,根源出在Python代码中列表初始化的位置不对!
看你嵌入的Python代码:在遍历脚本每一行的for line in file:循环里,你每次都重新创建了空的matches = [],然后只把当前行匹配到的单个函数信息加进去。这就导致每次排序的时候,列表里只有一个元素——单个元素的列表排序当然不会有任何变化,自然看不到排序效果。
修复后的代码
把matches = []移到for line in file:循环外面,先收集所有匹配到的函数-帮助信息,等全部收集完成后再统一排序,最后打印:
function print:help() { echo $SCRIPT_PATH python3 - << EOF from pathlib import Path from operator import itemgetter import re script_path = Path("$SCRIPT_PATH") matches = [] # 把列表初始化移到循环外面! with open(script_path) as file: for line in file: match = re.match(r'^function\s*([a-zA-Z0-9\:-]*)\(\)\s*{\s*##\s*(.*)', line) if match is not None: target, help_str = match.groups() # 避免和内置函数help重名 matches.append((target, help_str)) # 全部收集完成后再排序 matches.sort(key=itemgetter(0)) # 按函数名排序,对应你期望的输出顺序 # 若要按帮助文本排序可改用 itemgetter(1) for target, help_str in matches: print(" {0:20} {1}".format(target, help_str)) EOF }
额外优化点
- 我把变量名
help改成了help_str,因为help是Python的内置函数,用它当变量名容易引发潜在问题。 - 你期望的输出是按函数名排序(aa, build, project:init:all...),所以排序key用
itemgetter(0)(按元组第一个元素,也就是函数名排序),这样就能完美匹配你想要的顺序。
这样修改后,代码会先把所有匹配到的函数信息都存入matches列表,再对整个列表排序,最后按顺序打印,就能得到你期望的输出结果了。
内容的提问来源于stack exchange,提问作者Chad Lowe
相关产品推荐
相关产品推荐

