如何获取不含父模块的模块名?日志配置优化问询
更优雅地获取日志用的模块名(不含上游层级)
嘿,这个需求太合理了——日志里堆一堆上游模块名确实冗余,看着闹心!你当前用__name__.split('.')[-1]的思路没问题,但确实有更简洁高效的替代方案,而且能覆盖更多场景,下面给你拆解几种:
方案1:用rsplit替代split,提升效率
你的原代码已经能拿到最后一个模块名,但split('.')会把所有点都分割一遍,对于层级深的模块(比如pkg.sub.subsub.module)有点没必要。换成从右侧只分割一次的rsplit,性能更好,代码也更清晰:
import logging log = logging.getLogger(__name__.rsplit('.', 1)[-1])
- 优点:纯字符串操作,无需额外导入模块,速度快
- 缺点:如果模块作为主脚本直接运行(即
__name__ == '__main__'),会得到__main__而非实际的模块文件名,可能不符合日志命名预期
方案2:从文件路径直接提取模块名(推荐)
如果你希望不管模块是被导入还是直接运行,都能拿到真实的模块名(比如my_module而非__main__),可以借助os模块从__file__变量提取:
import os import logging # 提取文件名并去掉.py后缀 module_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(module_name)
- 优点:场景全覆盖,不管是导入还是直接运行,都能得到正确的模块名
- 缺点:需要导入标准库
os(不过几乎所有Python项目都会用到os,这点成本可以忽略)
方案3:兼容旧版本的inspect方法(不推荐)
曾经inspect模块的getmodulename方法也能做这件事,但在Python 3.10+已经被移除了,所以仅作历史参考:
# Python 3.9及以下可用,3.10+已弃用 import inspect import logging module_name = inspect.getmodulename(__file__) log = logging.getLogger(module_name)
总结选择
- 如果你的模块只会被导入(不会直接运行),方案1足够简洁高效;
- 如果模块可能被直接运行,方案2是更稳妥的选择,日志命名会更统一。
内容的提问来源于stack exchange,提问作者beemtee
相关产品推荐
相关产品推荐

