如何用Python getopt实现支持-v/-vv/-vvv的多级日志详细度功能
实现思路
核心是利用getopt对无参数短选项的默认合并解析规则,正确实现逻辑如下:
- 去掉短选项配置里
v后面的冒号:无参数短选项默认支持合并写法,-vv会被自动拆分为两个独立的-v选项分别返回 - 每次匹配到
-v选项时,直接将日志级别加1即可,无需判断参数值
示例代码
import sys import getopt from getopt import GetoptError VERBOSITY_LEVEL = 0 try: # 短选项配置去掉v后面的冒号,标记v为无参数选项 opts, args = getopt.getopt(sys.argv[1:], 'v', [...]) except GetoptError: print('wrong parameter') sys.exit(1) for opt, arg in opts: if opt == '-v': VERBOSITY_LEVEL += 1 # 其他参数处理逻辑 ...
这种写法下:
- 传
-v→ VERBOSITY_LEVEL = 1 - 传
-vv→ VERBOSITY_LEVEL = 2 - 传
-vvv→ VERBOSITY_LEVEL = 3
完全符合常见工具的参数规则。
扩展方案(可选支持显式指定级别)
如果你同时需要支持-v 3这种显式传入数值的用法,可以将短选项配置改为v::(双冒号代表参数可选),对应处理逻辑调整为:
VERBOSITY_LEVEL = 0 try: opts, args = getopt.getopt(sys.argv[1:], 'v::', [...]) except GetoptError: print('wrong parameter') sys.exit(1) for opt, arg in opts: if opt == '-v': if arg: # 支持直接传数值,比如-v 2 VERBOSITY_LEVEL = int(arg) else: # 没传参数就累加,比如-vv VERBOSITY_LEVEL += 1
注意双冒号是GNU getopt的扩展特性,大部分主流操作系统环境都兼容,可根据实际部署场景选择。
内容的提问来源于stack exchange,提问作者fgalan
相关产品推荐
相关产品推荐

