我有很多简单的脚本来计算一些东西。它们只包含一个模块。
我应该为它们编写主要方法并使用if __name__
构造调用它们,还是只将其转储到那里?
两种方法的优点是什么?
答案 0 :(得分:46)
我总是写一个main()
函数(适当命名),除了命令行解析和main()
块中if __name__ == '__main__'
的调用之外什么也没做。那是因为无论我最初期望脚本是多么愚蠢,琐碎或单一目的,我总是希望稍后再从另一个模块调用它。
要么我今天花时间把它变成一个可导入的模块,要么在几个月之后花费额外的时间来重构它,当我想把它重新用于别的东西时。
始终
每一次。
我已经停止了它并且从一开始就开始编写我的代码。
答案 1 :(得分:39)
好吧,如果你这样做:
# your code
然后import your_module
将执行您的代码。相反,有了这个:
if __name__ == '__main__':
# your code
导入不会运行代码,但是针对该文件的解释器将会。
如果脚本运行的唯一方法是通过手动解释器打开,那绝对没有区别。
当您拥有库(或重用脚本中的定义)时,这一点变得非常重要。
将代码添加到定义之外的库中,或者在if __name__
保护之外,在导入时运行代码,让您初始化库所需的内容。
也许你希望你的库也有一些可运行的功能。也许测试,或者像Python的SimpleHTTPServer(它附带一些类,但你也可以运行模块,它将启动一个服务器)。您可以使用if __name__
子句获得双重行为。
像epydoc
这样的工具导入模块来访问文档字符串,因此当您只是想生成HTML文档时运行代码并不是真正的意图。
答案 2 :(得分:10)
其他答案都很好,但我想添加一个例子,说明为什么你可能想要导入它:单元测试。如果您有一些函数,然后是if __name__=="__main__":
,则可以导入模块进行单元测试。也许你比我更擅长这一点,但我发现我的“简单的脚本不可能有任何错误”往往会出现我在单元测试中发现的错误。
答案 3 :(得分:6)
if __name__
结构将允许您轻松地在其他Python脚本中重用模块中的函数和类。如果您不这样做,那么模块中的所有内容都将在import
编辑时运行。
如果脚本中没有任何内容可以重用,那么请确保将其全部转储到那里。我有时这样做。如果您以后决定要重用某些代码,我发现Python只是最容易重构代码而不会破坏代码的语言。
答案 4 :(得分:1)
为了更好地解释Python的“主要后卫”习惯用法的目的,