我正在使用/重写首先定义函数的代码,如下所示:
def main(argv=[__name__]):
...
*rest of code*
...
并以:
结束if __name__ == "__main__":
sys.exit(main(sys.argv))
我的印象是,这样做是检查以确保脚本是从命令行执行的,然后运行函数main
,并在退出python时提供参数。但是,为什么有必要在函数定义中将变量argv
预设为[__name__]
?这不是我的代码,所以我不知道这背后的初衷。但是,我是使用if __name__ == "__main__":
行检查命令行执行的新手,所以可能有一些明显的原因导致我错过了这种语法。有关main
函数定义和参数/命令行与模块测试的任何帮助或更多详细信息将不胜感激。
答案 0 :(得分:1)
main()
定义允许以除文件底部的main()
行之外的其他方式调用sys.exit()
。这可能是防御性编程的一个示例,也可能表示此文件的其他受支持用途。
其中一个受支持的用途可能是从另一个Python程序调用它,如:
import your_module
your_module.main()
答案 1 :(得分:1)
对于argv=[__name__]
,原始开发者可能希望保留运行此函数的选项,而不是从命令行运行(即由另一个模块调用),并提供__name__
,因为它使用sys.argv[0]
1}}用于某些功能。
main
函数与python无关,只是一些约定(源自C
之类的语言)。 sys.exit(main(sys.argv))
将触发sys.exit
函数,退出代码等同于使用接收到的命令行参数运行main
函数的产品。 main
可能应返回适当的退出代码(0
表示正常,其他则表示各种例外情况。)
答案 2 :(得分:0)
从CLI运行脚本时,argv[0]
是脚本的名称,argv
的其余部分是命令行参数。因此,main()
的其余部分可能会期望argv[0]
始终被填充。
默认值是确保argv[0]
在导入文件时具有类似的内容,而不是直接运行。在这种情况下,它是模块的名称。