在简单的Python脚本中应该使用main()方法吗?

45 投票
5 回答
46945 浏览
提问于 2025-04-16 15:05

我有很多简单的脚本,用来计算一些东西。这些脚本通常只有一个模块。

我应该为它们写一个主方法,然后用if __name__这个结构来调用它们,还是直接把所有代码放在一起呢?

这两种方法各有什么好处呢?

5 个回答

10

其他的回答都不错,但我想补充一个例子,说明为什么你可能需要导入它:单元测试。如果你有几个函数,然后有一句if __name__=="__main__":,你就可以导入这个模块来进行单元测试。也许你比我更擅长这个,但我发现我的“简单脚本,肯定不会有任何错误”往往会在单元测试中发现一些错误。

53

我总是写一个叫做 main() 的函数,并且在 if __name__ == '__main__' 这个块里只放命令行解析和对 main() 的调用。这样做是因为不管我一开始觉得这个脚本多么简单、无聊或者只用一次,我总是会在之后的某个时候想从另一个模块调用它。

要么我今天花时间把它做成一个可以导入的模块,要么等到几个月后想要重复使用的时候再花额外的时间去重构它。

总是如此。

每一次都是。

我已经不再抗拒这个事实,而是从一开始就带着这个期望来写我的代码。

47

好吧,如果你这样做:

# your code

那么 import your_module 就会执行你的代码。相反,如果你这样做:

if __name__ == '__main__':
    # your code

那么导入不会运行代码,但直接让解释器去那个文件就会执行。

如果这个脚本唯一的运行方式是手动打开解释器,那就没有任何区别。

当你有一个库(或者想在脚本中重用定义)时,这就变得很重要了。

  1. 在库中添加代码,但不放在定义里面,或者不放在 if __name__ 的保护下,这样在导入时就会运行代码,让你初始化库需要的东西。

  2. 也许你希望你的库还有一些可运行的功能。比如测试,或者像Python的SimpleHTTPServer那样的功能(它有一些类,但你也可以运行这个模块,它会启动一个服务器)。你可以通过 if __name__ 这个条件来实现这种双重行为。

  3. epydoc 这样的工具会导入模块以访问文档字符串,所以在你只是想生成HTML文档时运行代码并不是它的目的。

撰写回答