You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

额外优化点

  1. 我把变量名help改成了help_str,因为help是Python的内置函数,用它当变量名容易引发潜在问题。
  2. 你期望的输出是按函数名排序(aa, build, project:init:all...),所以排序key用itemgetter(0)(按元组第一个元素,也就是函数名排序),这样就能完美匹配你想要的顺序。

这样修改后,代码会先把所有匹配到的函数信息都存入matches列表,再对整个列表排序,最后按顺序打印,就能得到你期望的输出结果了。

内容的提问来源于stack exchange,提问作者Chad Lowe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:19:08