免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2735 | 回复: 0
打印 上一主题 下一主题

python main [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-26 22:47 |只看该作者 |倒序浏览

"""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()
I'm sure many people write similar main() functions. I've got a few suggestions that make main() a little more flexible, especially as option parsing becomes more complex.
First, we change main() to take an optional 'argv' argument, which allows us to call it from the interactive Python prompt:
def main(argv=None):
    if argv is None:
        argv = sys.argv
    # etc., replacing sys.argv with argv in the getopt() call.
Note that we fill in the default for argv dynamically. This is more flexible than writing
def main(argv=sys.argv):
    # etc.
because sys.argv might have been changed by the time the call is made; the default argument is calculated at the time the main() function is defined, for all times.
Now the sys.exit() calls are annoying: when main() calls sys.exit(), your interactive Python interpreter will  The remedy is to let main()'s return value specify the exit status. Thus, the code at the very end becomes
if __name__ == "__main__":
    sys.exit(main())
and the calls to sys.exit(n) inside main() all become return n.
Another refinement is to define a Usage() exception, which we catch in an except clause at the end of main():
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())
This gives the main() function a single exit point, which is preferable over multiple return 2 statements. This also makes it easier to refactor the argument parsing: raise Usage works just fine from inside a helper function, but return 2 would require careful passing on of the return values.
You might think that taking this to the extreme would move the try/except clause out of the main() function, into the code at the end of the module (if __name__ == "__main__": .... But that would mean that when you call main() interactively, you'd get a traceback for command line syntax errors, which isn't very helpful.
However, another generalization can be helpful: define another exception, perhaps called Error, which is treated just like Usage but returns 1. This can then be used for expected errors like failure to open necessary files, which are not command line syntax errors, but yet expected, and where again a traceback doesn't feel very friendly.
What


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104335/showart_2060862.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP