ExASIC
分享让工作更轻松

自己写个argument parser

python的argparse总是感觉太复杂、不够简洁。还是怀念perl的Getopt::Long,返回一个简单的哈希数组足以。

常见的参数格式

常见的参数格式有以下几种:

  1. -xxx '-'开头,只有关键字,不带值
  2. -xxx=abc '-'开头,key-value对
  3. +xxx=abc '+'开头
  4. -xxx abc '-'开头,等于号用空格带替
  5. xxx 不带特殊前缀
  6. --xxx[=abc] 双'-'开头

一般自己写的脚本里并不需要这么杂,规定前两种也够用了。比如,-verdi表示打开verdi,-lst=rtl.flist表示rtl的文件列表等。

python里的sys.argv

其实python的sys.argv已经帮我们拿到了命令行参数。sys.argv是一个列表,按照输入顺序,用空格切分,依次存储各参数。例如,

# test.py
import 
print(sys.argv)

运行结果:

$ python test.py -verdi -lst=rtl.flist]
['test.py', '-verdi', '-lst=rtl.flist]']

列表第0个是当前的程序(脚本)名,后面依次是输入的参数。

最简单的参数parser

用for循环遍历sys.argv,调用处理函数或者设置全局变量。

import sys
import re

for arg in sys.argv:
    if arg.startswith('-'):
        if re.search(r'^-(\w+)=\(w+)$'):
            # ...
        elif re.search(r'^-(\w+)$'):
            # ...

当脚本很小,且参数个数只有1~3个时,直接在脚本里判断和处理sys.argv是还很方便的。

把参数处理的函数单独写成module

考虑到可复用性,我们把上面的脚本写到单独的文件里,比如argopt.py里。并且把处理的结果存储到一个dict变量里,因为dict的key-value跟“参数-值”一致。另外dict在处理key-value对时有一些现成的函数。

import sys
import re

# store -option or --option
args = {}

# store +option
argplus = []

# store argument spec
argspec = {}

# parse sys.argv by spec and store into dict
def arg_options(*spec):
    # ...
def arg_help():
    # ...
def arg_check():
    # ...
def arg_verbose():
    # ...

if __name__ == '__main__':
    #example
    arg_options('-h', '-dump', '-verdi', '-lst=s', '-clean', '-seed=s', '-tc=s')
    arg_check()
    arg_verbose()

    if "h" in args:
    arg_help()
    sys.exit()

    filename = "file.flist"
    if "lst" in args:
        filename = args['lst']

    if "tc" in args:
    tc = "tc/" + args['tc'] + '.sv'

在使用时,使用for 'key' in args判断参数是否存在,使用args['key']来引用参数的值。

完整代码下载链接: argopt.py

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA