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

时间:2011-04-04 21:48:55

标签: python

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

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

两种方法的优点是什么?

5 个答案:

答案 0 :(得分:46)

我总是写一个main()函数(适当命名),除了命令行解析和main()块中if __name__ == '__main__'的调用之外什么也没做。那是因为无论我最初期望脚本是多么愚蠢,琐碎或单一目的,我总是希望稍后再从另一个模块调用它。

要么我今天花时间把它变成一个可导入的模块,要么在几个月之后花费额外的时间来重构它,当我想把它重新用于别的东西时。

始终

每一次。

我已经停止了它并且从一开始就开始编写我的代码。

答案 1 :(得分:39)

好吧,如果你这样做:

# your code

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

if __name__ == '__main__':
    # your code

导入不会运行代码,但是针对该文件的解释器将会。

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

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

  1. 将代码添加到定义之外的库中,或者在if __name__保护之外,在导入时运行代码,让您初始化库所需的内容。

  2. 也许你希望你的库也有一些可运行的功能。也许测试,或者像Python的SimpleHTTPServer(它附带一些类,但你也可以运行模块,它将启动一个服务器)。您可以使用if __name__子句获得双重行为。

  3. epydoc这样的工具导入模块来访问文档字符串,因此当您只是想生成HTML文档时运行代码并不是真正的意图。

答案 2 :(得分:10)

其他答案都很好,但我想添加一个例子,说明为什么你可能想要导入它:单元测试。如果您有一些函数,然后是if __name__=="__main__":,则可以导入模块进行单元测试。也许你比我更擅长这一点,但我发现我的“简单的脚本不可能有任何错误”往往会出现我在单元测试中发现的错误。

答案 3 :(得分:6)

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

如果脚本中没有任何内容可以重用,那么请确保将其全部转储到那里。我有时这样做。如果您以后决定要重用某些代码,我发现Python只是最容易重构代码而不会破坏代码的语言。

答案 4 :(得分:1)

为了更好地解释Python的“主要后卫”习惯用法的目的,

What does if __name__ == "__main__": do?