main函数的位置-main是个无参函数吗
在编程的世界里,无论是哪一位程序员,都曾在编程生涯中频繁书写main()函数,Python程序员亦然。今天,我们将与大家分享Python之父Guido van Rossum推荐的main()函数编写方式,它能够显著提升这一函数的灵活性。
Guido在编程界的地位备受尊崇,甚至有一篇文章将他列入历史上最伟大的12名程序员之中。
通常,Python程序员书写main()函数的方式可能是这样的:
尽管Guido过去也采用过类似的main()函数结构,但他深知其灵活性尚有提升空间,特别是在需要解析复杂的命令行选项时。他向大家提出了一些建议。
添加可选的argv参数
def main(argv=None):
if argv is None:
argv = sys.argv
以下代码中用argv替换getopt()调用中的sys.argv
通过这种方式,我们可以动态地提供argv的值,相比直接使用sys.argv作为默认值要更加灵活。
这是因为函数中的默认值是在定义时计算好的静态值,而可选参数则可以在调用时动态指定。使用argv作为可选参数能够提供更大的灵活性。
当main()函数调用sys.exit()时,在交互式解释器中会出现问题:解释器会退出。为了解决这个问题,我们可以让main()函数的返回值来指示退出状态。
if __name__ == "__main__":
sys.exit(main())
将main()函数中的sys.exit(n)调用改为return n。
定义Usage异常
另一个改进点是定义一个Usage异常。我们可以在main()函数最后的except子句中捕捉该异常。
这样,main()函数只有一个退出点,相比之前两个退出点的做法更为优雅。对于参数解析的重构也更为简单。在辅助函数中引发Usage异常更为方便,而使用return 2则需要仔细处理返回值传递的问题。