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)了,这比之前两个退出点的做法要好。而且,参数解析重构起来也更容易:AxiTrader返佣www.kaifx.cn/broker/axitrader.html,在辅助函数中引发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();?
另一方面:通过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函数入口就可以调用测试自己写的函数啦~

原文地址:https://blog.51cto.com/14511863/2437797

时间: 2024-10-11 21:28:31

python 如何写好main函数的相关文章

Python的main函数

初学Python,写C++时,习惯写上main函数,作为程序入口, 但是,在写Python时,只能看见 __name__ == "__main__", 于是,探个究竟,Python程序从哪开始?啧啧,虽然它多数是脚本~ 转自下面链接的一段话: http://blog.163.com/benben_long/blog/static/199458243201212123099/ if __name__=="__main__":     print("main&

C#main函数

Main函数: static void Main(string [] args) { }程序代码需要写在Main函数的花括号内. 一.输出:Console.WriteLine("这是我的第一个程序.");自动换行Console.WriteLine("这是第二行代码.");自动换行Console.Write("这是要输出的文字.");注意:没有换行注意:1.大小写敏感:2.所有的符号全都用英文:3.不要漏掉;. 二.输入:string s = Co

为什么要使用main函数

我们可能会认为使用main函数毫无意义,因为我们可以直接把代码放到程序里直接运行就好了,干嘛要写在main函数里最后再调用 原因如下: 1使用main()函数可以限制全局变量的个数 2使用main函数可以便于调试其它函数:我们可以把文件放到已经添加path的文件夹下面,直接import文件名,使用里面的函数,输入相关参数,查看函数运行结果: 当如果是在调试状态下,即你通过import导入了这个文件,然后再运行其中的函数的话,main函数不会运行,因为此时__name__值为文件名 如果直接运行这

??px4原生源码学习(1/3)-----为什么没main函数!!!!!

本文转自px4原生源码学习-(2)--实时操作系统篇 * 为什么我要谈到实时操作系统? 如果你只是开发一个简简单单的单片机程序,不用考虑以后对于程序的升级与修改,那么你简简单单写个main函数的while循环其实没什么不好.但你要遇到那种开发周期长,系统复杂的产品或者项目,那最好是基于实时操作系统开发.因为这对于代码重用和添加新功能或者新设备来说会方便挺很多,代码的编写程度也会简单很多.像早期的apm飞控也是基于板子的main函数,导致其代码复杂,冗余,后面直接被弃,因为可能每添加一个功能或者设

windows平台中让函数在main函数之前执行的方法

1.将要执行的代码写到类的构造函数中,并定义对应的全局变量2.将要执行的代码写到TLS回调函数中在c/c++中,我们都知道main函数是程序开始执行的地方,但是在进行反调试的时候,很多时候都需要调试检测函数在main函数之前执行. 1.将要执行的代码写到类的构造函数中,并定义对应的全局变量在windows平台中,执行我们手写的main函数之前,系统会执行一段CRTstartup代码,对系统的堆栈.全局变量.命令行参数.环境变量等进行初始化操作.该方法就是利用windows在执行main函数之前先

python 中main函数总结

Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数. 每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'.这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当

如何理解Python的Main函数?

作者:蟒蛇帝国(ID:Pythondg) 难度:初级 演示环境:OS:ubuntu 16.04Python:3.6 编写 Python 代码的时候我们经常看到下面这条语句.貌似是 Python 的 Main 函数.那它具体是什么意思呢. if __name__ == '__main__':     print('hello world') 首先 Python 里有两个概念, 源码文件: ~/code_house/py_dev$ tree . ├── file1.py ├── file2.py └

python: 怎样写一个函数把名字大写并变成下面这样——字典与三引号

例题:python: 怎样写一个函数把名字大写并变成下面这样? 字典+列表:将每个字母以列表形式存在字典里,分六次打印输出: dic = { } dic['C']=[ ' CCCC ', ' C C', 'C ', 'C ', ' C C', ' CCCC ' ] dic['A']=[ ' A ', ' A A ', ' A A ', ' AAAAAAA ', ' A A ', 'A A' ] dic['T']=[ 'TTTTTTT', ' T ', ' T ', ' T ', ' T ', '

python main函数中变量默认为global variable

在python的main函数中的变量默认为全局变量,而其他的def函数中的变量则默认为局部变量. 当然,局部变量会优先于全局变量,在执行formal_print(t_global)语句时便可看出. 测试代码如下: <span style="font-size:18px;">#coding=utf-8 #测试python的全局变量,局部变量的机制 def formal_print(s_global):#常规的传参用法,传递参数进行print,变量名可任意 print &quo