在简单的Python脚本中应该使用main()方法吗?
我有很多简单的脚本,用来计算一些东西。这些脚本通常只有一个模块。
我应该为它们写一个主方法,然后用if __name__
这个结构来调用它们,还是直接把所有代码放在一起呢?
这两种方法各有什么好处呢?
5 个回答
其他的回答都不错,但我想补充一个例子,说明为什么你可能需要导入它:单元测试。如果你有几个函数,然后有一句if __name__=="__main__":
,你就可以导入这个模块来进行单元测试。也许你比我更擅长这个,但我发现我的“简单脚本,肯定不会有任何错误”往往会在单元测试中发现一些错误。
我总是写一个叫做 main()
的函数,并且在 if __name__ == '__main__'
这个块里只放命令行解析和对 main()
的调用。这样做是因为不管我一开始觉得这个脚本多么简单、无聊或者只用一次,我总是会在之后的某个时候想从另一个模块调用它。
要么我今天花时间把它做成一个可以导入的模块,要么等到几个月后想要重复使用的时候再花额外的时间去重构它。
总是如此。
每一次都是。
我已经不再抗拒这个事实,而是从一开始就带着这个期望来写我的代码。
好吧,如果你这样做:
# your code
那么 import your_module
就会执行你的代码。相反,如果你这样做:
if __name__ == '__main__':
# your code
那么导入不会运行代码,但直接让解释器去那个文件就会执行。
如果这个脚本唯一的运行方式是手动打开解释器,那就没有任何区别。
当你有一个库(或者想在脚本中重用定义)时,这就变得很重要了。
在库中添加代码,但不放在定义里面,或者不放在
if __name__
的保护下,这样在导入时就会运行代码,让你初始化库需要的东西。也许你希望你的库还有一些可运行的功能。比如测试,或者像Python的SimpleHTTPServer那样的功能(它有一些类,但你也可以运行这个模块,它会启动一个服务器)。你可以通过
if __name__
这个条件来实现这种双重行为。像
epydoc
这样的工具会导入模块以访问文档字符串,所以在你只是想生成HTML文档时运行代码并不是它的目的。