#158298·Python

在不存在目录的情况下,gettext 在每次调用时都会重新检查文件系统,这会延缓 argparse 解析器的构建

作者: aktanazat创建于 2026年9月27日更新于 2026年9月29日
标签type-featureperformancestdlib

提案:

gettext.gettext() 和 ngettext() 通过 dgettext()/dngettext() 进行,这些函数调用 translation(),而 translation() 又调用 find() 每次(Lib/gettext.py:591-596 和 :492-525 在主 7731da1fe749eafe0d97f80ab0021d6fd1b47c8d 中)。find() 没有缓存。使用 LANG=en_US.UTF-8,每次调用都会在四个候选的 .mo 路径上运行 os.path.exists,找不到任何内容,translation() 会引发 FileNotFoundError,dgettext() 会捕获此错误。如果没有目录,每次的答案都是相同的,但每次调用时都会重新计算。argparse 使此行为可见。每个 ArgumentParser 在构建时都会调用 _() 三次(Lib/argparse.py:2049、:2050 和 :2063),因此具有 20 个子命令的 CLI 会在构建其解析器时执行 63 次 find() 调用和 252 次 os.path.exists 调用。