Should I use a main() method in a simple Python script?
我有很多简单的脚本可以计算一些东西。它们只包含一个模块。
我应该为它们编写主要方法并用if __name__构造调用它们,还是直接将其转储到其中?
这两种方法的优点是什么?
我总是编写一个main()函数(适当命名),只在if __name__ == '__main__'块中进行命令行分析和对main()的调用。这是因为无论我最初期望脚本是多么愚蠢、琐碎或单一的目的,我最终总是希望在以后的某个时候从另一个模块调用它。
要么我今天花时间把它变成一个可导入的模块,要么花额外的时间在几个月后重构它,当我想将它重新用于其他用途时。
总是。
每一次。
我停止了与之抗争,从一开始就用这种期望编写代码。
- +1:这不是什么额外的工作,从一开始就做。
- 我通常从if name复制粘贴…每次我决定实际使用我制作的模块/代码块时。至少我把它们放在函数dev1(),dev2()中。在我成长的过程中,我可以看到我所做的一切。永远没有理由不将代码保存在模块中(我猜,直到您释放它为止)
- +1-这是我使用的相同实践,一个由if __name__屏障调用的模块级main()函数。它也是创建控制台脚本入口点的良好模式,例如'console_scripts': ['myscript=foo.mybar:main']。
- 这个scite的缩写意味着我只是在一个新的python文件中键入py作为完整的主结构。任何优秀的编辑都会有类似的能力:py=!/usr/bin/env python " def main(): "如果文件已执行,则调用它。 if name='main': main()
- @肖恩,好消息!Sublime文本中有一个ifmain片段,用于插入"if-uuu-name_uuuu…"部分。
- @S.lott抱歉,如果这是一个愚蠢的问题,但是您是在main()的内部还是外部定义函数?
好吧,如果你这样做:
然后,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的"主要防护"习语的用途:
如果"名字"是什么?