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

Python中用__name__ != "__main__"在导入时执行代码是否合规?

问题解答

一、__name__ != "__main__"方案是否恰当?

这个方案可行且合理,但要匹配具体场景:

  • 如果你需要初始化代码仅在模块被导入时执行,而当模块直接作为脚本运行(python utils.py)时跳过,这个判断逻辑完全适用。
  • 但如果初始化是模块无论被导入还是直接运行都需要的步骤,其实没必要加这个判断——直接把初始化代码放在所有函数定义之后即可,这是Python社区最普遍的写法。

另外你的示例代码有语法错误:global logger = logging.get_logger(__name__) 不符合Python语法,应拆分为:

def setup():
    global logger
    logger = get_logger(__name__)  # 注意调用你自定义的get_logger,而非logging原生方法

二、满足「先定义函数,再执行初始化」的其他行业惯例

1. 将初始化代码放在模块底部(最常用)

这是Python社区的默认规范:先完成所有函数、类的定义,最后编写模块级执行代码。完全符合Python从上到下的执行逻辑,结构清晰,其他开发者能快速定位初始化逻辑。示例:

import logging

def get_logger(name: str):
    # 你的日志配置逻辑
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    # 添加handler、formatter等配置
    return logger

def setup():
    global logger
    logger = get_logger(__name__)

# 初始化代码放在模块最后
setup()

# 若需区分直接运行模块的场景,可追加:
if __name__ == "__main__":
    # 直接运行时的测试或调试逻辑
    logger.info("Utils module running as main script")

2. 延迟初始化(懒加载)

如果希望初始化逻辑和变量定义更贴近,或避免模块导入时的不必要开销,可采用懒加载——仅在第一次使用变量时执行初始化。示例:

import logging

def get_logger(name: str):
    # 日志配置逻辑
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    return logger

# 模块级变量初始化为None
logger = None

def get_module_logger():
    global logger
    if logger is None:
        logger = get_logger(__name__)
    return logger

# 模块内部使用时调用get_module_logger()即可
def some_util_func():
    log = get_module_logger()
    log.info("Executing utility function")

这种方式无需提前调用初始化函数,既保证函数优先定义,又能自动完成初始化,还能避免重复执行。

3. 用类封装初始化逻辑(进阶)

若模块初始化逻辑复杂,可通过专门的初始化类封装,但工具模块中很少用到,仅适用于场景复杂的情况:

import logging

def get_logger(name: str):
    # 日志配置逻辑
    return logging.getLogger(name)

class ModuleInitializer:
    def __init__(self):
        self.logger = get_logger(__name__)

# 实例化类完成初始化
init = ModuleInitializer()
# 模块内部通过init.logger访问日志器

针对你的场景建议

你的utils.py是供其他脚本调用的工具模块,最推荐第一种方案(初始化代码放底部)——符合社区惯例,代码结构清晰,维护成本低。如果想让初始化逻辑更显眼,可在函数定义后添加注释说明,或采用懒加载模式让初始化逻辑与变量定义绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:55:01