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

Should I use a main() method in a simple Python script?

我有很多简单的脚本可以计算一些东西。它们只包含一个模块。

我应该为它们编写主要方法并用if __name__构造调用它们,还是直接将其转储到其中?

这两种方法的优点是什么?


我总是编写一个main()函数(适当命名),只在if __name__ == '__main__'块中进行命令行分析和对main()的调用。这是因为无论我最初期望脚本是多么愚蠢、琐碎或单一的目的,我最终总是希望在以后的某个时候从另一个模块调用它。

要么我今天花时间把它变成一个可导入的模块,要么花额外的时间在几个月后重构它,当我想将它重新用于其他用途时。

总是。

每一次。

我停止了与之抗争,从一开始就用这种期望编写代码。


好吧,如果你这样做:

1
# your code

然后,import your_module将执行您的代码。相反,有了这个:

1
2
if __name__ == '__main__':
    # your code

导入不会运行代码,但将解释器定位到该文件。

如果脚本运行的唯一方式是通过手动解释器打开,那绝对没有区别。

当您有一个库(或者重用脚本中的定义)时,这一点变得很重要。

  • 向定义之外的库添加代码,或者在if __name__的保护之外添加代码会在导入时运行代码,使您可以初始化库所需的内容。

  • 也许您希望您的库也有一些可运行的功能。可能是测试,也可能是类似于python的simplehttpserver(它附带了一些类,但是您也可以运行模块,它将启动服务器)。你可以在if __name__条款中有这种双重行为。

  • epydoc这样的工具导入模块来访问docstrings,所以在您只想生成HTML文档时运行代码并不是真正的目的。


  • 其他的答案很好,但是我想添加一个例子,说明为什么您可能希望能够导入它:单元测试。如果您有一些功能,然后是if __name__=="__main__":,那么您可以导入模块进行单元测试。也许你比我更擅长这个,但是我发现我的"不可能有任何错误的简单脚本"倾向于有我在单元测试中发现的错误。


    if __name__结构允许您在其他Python脚本中轻松地重用模块中的函数和类。如果不这样做,那么当模块是imported时,模块中的所有内容都将运行。

    如果脚本中没有要重用的内容,那么当然,只需将其全部转储到其中。我有时会这样做。如果您稍后决定重用一些代码,我发现Python是最简单的语言,可以在不破坏代码的情况下重构代码。


    为了更好地解释Python的"主要防护"习语的用途:

    如果"名字"是什么?