ArgumentParser使用详解

司寇瑾瑜
2023-12-01

定义argparse对象

当一个程序使用了argparse,例如main.py,你可以使用python main.py -h来查看各个参数的使用介绍

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)

description=None 此ArgumentParser的描述
formatter_class=argparse.HelpFormatter 帮助文档的显示格式,可以取
        argparse.RawDescriptionHelpFormatter
        argparse.RawTextHelpFormatter
        argparse.ArgumentDefaultsHelpFormatter
        argparse.MetavarTypeHelpFormatter
        
例如:
>>>parser = argparse.ArgumentParser(description='''this description 
was indented weird 
but that is okay''', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--foo', type=int, default=42, help='FOO!')
parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
parser.print_help()

输出:
usage: pydevconsole.py [-h] [--foo FOO] [bar [bar ...]]
    
this description was indented weird but that is okay

positional arguments:
  bar         BAR! (default: [1, 2, 3])

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   FOO! (default: 42)

添加参数

import argparse

parser = argparse.ArgumentParser()

# 多选一,必须将--a赋值为aaa或bbb,指定default无效(即使default='aaa',仍然要显式赋值)
# parser.add_argument('--a', type=str, choices=['aaa', 'bbb'])
# print(parser.parse_args(['--a', 'aaa']))
# print(parser.parse_args(['--a', 'bbb']))
# print(parser.parse_args(['--a', 'ccc']))
# Namespace(a='aaa')
# Namespace(a='bbb')
# main.py: error: argument --a: expected one argument

# 不指定type则type=str,help为该参数的帮助说明
# parser.add_argument('--a', help='testA')
# print(parser.parse_args(['--a', 'ttt']))
# Namespace(a='ttt')

# --a和-a均可
# parser.add_argument('-a', help='testA')
# print(parser.parse_args(['-a', 'ttt']))
# Namespace(a='ttt')

# dest为该变量parse_args后返回的参数名,默认为--后面的符号
# parser.add_argument('--a', dest='showA')
# print(parser.parse_args(['--a', 'ttt']))
# Namespace(showA='ttt')

# 默认值
# parser.add_argument('--a', default='ttt')
# print(parser.parse_args([]))
# Namespace(a='ttt')

# 无默认值 若不赋值则为None
# parser.add_argument('--a')
# print(parser.parse_args([]))
# Namespace(a=None)

# 无默认值,且required=True,则必须赋值否则报错(无equired=True则不报错返回None)
# parser.add_argument('--a', required=True)
# print(parser.parse_args(['--a', 'ttt']))
# Namespace(a='ttt')

# 使用--a则为True,否则为False
# parser.add_argument('--a', action='store_true')
# print(parser.parse_args(['--a']))
# print(parser.parse_args([]))
# Namespace(a=True)
# Namespace(a=False)

# 使用--a则为False,否则为True
# parser.add_argument('--a', action='store_false')
# print(parser.parse_args(['--a']))
# print(parser.parse_args([]))
# Namespace(a=False)
# Namespace(a=True)

# 无论str int float 直接启动都是用字符串''指定,在命令行启动可以使用int或float指定
# parser.add_argument('--b', type=str, default='defaultb', help='testB')
# parser.add_argument('--e', type=int, default=3, help='testE')
# parser.add_argument('--f', type=float, default=0.02, help='testF')
# print(parser.parse_args([]))
# print(parser.parse_args(['--b', 'ttt', '--e', '4', '--f', '0.05']))
# Namespace(b='defaultb', e=3, f=0.02)
# Namespace(b='ttt', e=4, f=0.05)

指定和使用参数

使用参数

# parser.parse_args返回一个Namespace,可以像使用字典一样使用它

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--a', type=str)
parser.add_argument('--b', type=int)

args = parser.parse_args(['--a', 'ttt', '--b', '4'])

print(args)
# Namespace(a='ttt', b=4)
print(args.a, args.b)
# ttt 4

指定参数

直接启动

# 向parser.parse_args传参数
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--a', type=str)
parser.add_argument('--b', type=int)

args = parser.parse_args(['--a', 'ttt', '--b', '4'])
print(args)
print(args.a, args.b)

命令行启动

# test.py
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--a', type=str)
    parser.add_argument('--b', type=int)
    args = parser.parse_args()
    print(args)
    print(args.a, args.b)

    
# 命令行启动 输出
> python .\test.py --a 'ttt' --b '4'
Namespace(a='ttt', b=4)
ttt 4

> python .\test.py --a 'ttt' --b 4
Namespace(a='ttt', b=4)
ttt 4
 类似资料: