python 如何写好main函数
每个程序员在学习编程的过程中,肯定没少写过main()函数,Python程序员也不例外。本文为大家分享Python之父Guido van Rossum推荐的函数写法,可以大大提高这个函数的灵活性。
一般来说,Python程序员可能是这样写main()函数的:
"""Module docstring.
This serves as a long usage message.
"""
import sys
import getopt
def main():
# parse command line options
try:
opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
except getopt.error, msg:
print msg
print "for help use --help"
sys.exit(2)
# process options
for o, a in opts:
if o in ("-h", "--help"):
print __doc__
sys.exit(0)
# process arguments
for arg in args:
process(arg) # process() is defined elsewhere
if __name__ == "__main__":
main()
Guido也承认之前自己写的main()函数也是类似的结构,但是这样写的灵活性还不够高,尤其是需要解析复杂的命令行选项时。为此,他向大家提出了几点建议。
添加可选的 argv 参数
首先,修改main()函数,使其接受一个可选参数 argv,支持在交互式shell中调用该函数:
def main(argv=None):
if argv is None:
argv = sys.argv
# etc., replacing sys.argv with argv in the getopt() call.
这样做,我们就可以动态地提供 argv 的值,这比下面这样写更加的灵活:
def main(argv=sys.argv):
# etc.
这是因为在调用函数时,sys.argv 的值可能会发生变化;可选参数的默认值都是在定义main()函数时,就已经计算好的。
但是现在sys.exit()函数调用会产生问题:当main()函数调用sys.exit()时,交互式解释器就会推出!解决办法是让main()函数的返回值指示退出状态(exit status)。因此,最后面的那行代码就变成了这样:
if __name__ == "__main__":
sys.exit(main())
并且,main()函数中的sys.exit(n)调用全部变成return n。
定义一个Usage()异常
另一个改进之处,就是定义一个Usage()异常,可以在main()函数最后的except子句捕捉该异常:
import sys
import getopt
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], "h", ["help"])
except getopt.error, msg:
raise Usage(msg)
# more code, unchanged
except Usage, err:
print >>sys.stderr, err.msg
print >>sys.stderr, "for help use --help"
return 2
if __name__ == "__main__":
sys.exit(main())
这样main()函数就只有一个退出点(exit)了,这比之前两个退出点的做法要好。而且,参数解析重构起来也更容易:在辅助函数中引发Usage的问题不大,但是使用return 2却要求仔细处理返回值传递的问题。
python 中name == ‘__main__’ 的作用
经典的英文解释:Make a script both importable and executable
中文解释:使脚本可以被调用import并且也可以直接运行
1、直接运行
# cat test_fun.py
def fun():
print(__name__)
print('this is fun')
if __name__ == '__main__':
fun()
print('this is main')
python test_fun.py
__main__
this is fun
this is main
2、被调用import
>>> import test_fun
>>> test_fun.fun()
test_fun
this is fun
调用导入时:此处输出没有显示”main“,也就是说模块name = ‘main’ 下面的代码并未执行,main函数没有执行。
这个功能还有一个用处:调试代码的时候,在”if name == ‘main‘“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
python是一种解释型脚本语言,和C/C++语言不同,C/C++程序从main函数开始执行,python程序从开始到结尾顺序执行。先总结下python中的main函数的作用:让模块(函数)可以自己单独执行(调试),相当于构造了调用其它函数的入口,这就类似于C/C++里面的mian函数了。
一方面:我们想要自己单独执行(调试)
这里我们实际调试一下(假设这个文件是test.py):
#test.py
print('Hello World!')
def aaa():
print('this message is from aaa function')
def main():
print('this message is from main function')
if __name__ == '__main__':
main()
print ('now __name__ is %s' %__name__)
执行python test.py 输出:
Hello World!
this message is from main function
now __name__ is __main__
这里我们看到我们定义的aaa函数没有被执行,而main函数里面的内容被执行了,表明 if __name__ == '__main__': 这条判断语句是通过的,执行了判断条件里的main();
另一方面:外汇返佣http://www.kaifx.cn/,通过import命令就可以使用其它.py文件里面的函数,我们将test.py中的模块(函数)导入call.py,需注意test.py和call.py放在同一个文件夹下;
#call.py
from test import aaa
aaa()
print ('now __name__ is %s' %__name__)
执行python call.py 输出:
Hello World!
this message is from aaa function
now __name__ is __main__
所以当我们自己写了.py文件,想要测试里面的函数时,就这样构造一个main函数入口就可以调用测试自己写的函数啦~
python 如何写好main函数的更多相关文章
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...
- 1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、212345等. 要求:”4”不能在第三位,”3”与”5”不能相连。
private static String[] mustExistNumber = new String[] { "1", "2", "2" ...
- Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提"Python 的 main 函数"."建议写 main 函数"-- 有些人 ...
- [置顶] Embedded Server:像写main函数一样写Web Server
1.传统的JEE Web Server 传统的JEE中,如果我们想要部署一个Web Application,我们需要首先安装一个Container Server,如JBoss,WebLogic,Tom ...
- Python3 Selenium自动化web测试 ==>FAQ:PyCharm中脚本不执行main函数内容解决方案
FAQ: 情景:之前写好可以正常执行的python脚本,突然main函数下的代码不运行 原因:pycharm中,会设置py脚本按照unittest的方式运行,也就是只运行用例,不运行main函数下代码 ...
- 从创建进程到进入main函数,发生了什么?
前几天,读者群里有小伙伴提问:从进程创建后,到底是怎么进入我写的main函数的? 今天这篇文章就来聊聊这个话题. 首先先划定一下这个问题的讨论范围:C/C++语言 这篇文章主要讨论的是操作系统层面上对 ...
- Spark&Hadoop:scala编写spark任务jar包,运行无法识别main函数,怎么办?
昨晚和同事一起看一个scala写的程序,程序都写完了,且在idea上debug运行是ok的.但我们不能调试的方式部署在客户机器上,于是打包吧.打包时,我们是采用把外部引入的五个包(spark-asse ...
- python 中main函数总结
Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数. 每个文件(模块)都可以任意写一些没有缩进的代码 ...
- python main函数
关于Python的主(main)函数问题 2007-07-23 19:14 初次接触Python的人会很不习惯Python没有main主函数.这里简单的介绍一下,在Python中使用main函数的方法 ...
随机推荐
- linux常用命令记录(一)
文件搜索命令 grep在文件中查找字符并输出 grep 字符或字符串 文件目录 grep pub /teach/.txt -c 字符出现总行数 grep .txt -n 行号 grep .txt -i ...
- 论文学习——《Learning to Compose with Professional Photographs on the Web》 (ACM MM 2017)
总结 1.这篇论文的思路基于一个简单的假设:专业摄影师拍出来的图片一般具备比较好的构图,而如果从他们的图片中随机抠出一块,那抠出的图片大概率就毁了.也就是说,原图在构图方面的分数应该高于抠出来的图片. ...
- 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?
注意: 我比较弱, 并没有办法把外链bgm搞成https, 所以大家可以选择"加载不安全的脚本"或者把https改成http以获得更好的阅读体验! 据说, 退役了要写写回忆录. 但 ...
- https原理 就是两次http
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤: (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接. (2)Web服务器收到客户端请求后,会将网站的证书 ...
- Windows——关于Word2016/2019提示需要修复问题处理
一.问题描述 打开Word提示 很抱歉此功能看似已中断,并需要修复.请使用Windows控制面板中的“程序和功能”选项修复Microsoft Office. 二.解决方法 运行 regedit 进入注 ...
- vue生命周期-标注
作者:FlyDragon 出处:http://www.cnblogs.com/fly_dragon/ 关于作者:专注于微软平台项目架构.管理和企业解决方案.如有问题或建议,请多多赐教! 本文版权归作者 ...
- centos 单用户登陆模式操作
在centos中因为安装java而配置 jdk环境变量的原因,对/etc/profile文件进行了编辑 错误的环境变量配置导致在第一次修改profile文件并保存后,执行source /etc/pro ...
- Python内部变量与外部变量
def outer(): x = 'outer x' def inner(): x = 'inner x' print(x) inner() print(x) # 这里的`x`与`x = 'outer ...
- 关于C#中Convert.ToInt32()是干什么用的
并非每个对象都可以直接转换为int.例如,以下内容将无法编译: string Maomao = "100"; int i = (int)Maomao; 因为string无法隐式转换 ...
- 数据结构(c语言版,严蔚敏)第1章绪论
第1章严蔚敏