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