zoukankan      html  css  js  c++  java
  • python argparse(参数解析)模块学习(二)

         转载自:http://www.cnblogs.com/fireflow/p/4841389.html(我去。。没转载功能,ctrl + c 和 ctrl + v 得来的,格式有点问题,可去原版看看)

            add_argument()方法的定义了如何解析一个命令行参数,每个参数都有各自独立的设置参数。

            1.name or flags
            add_argument()必须知道参数是可选的还是必须的位置参数,第一个传递给add_arguments的参数必须是可选参数或者是位置参数,例如,下面是可选参数。
    1. >>> parser.add_argument('-f','--foo')
             而位置参数如下设置:
    1. >>> parser.add_argument('bar')
            当调用parse_args()函数时,可选参数通过加上前缀-来明确,剩下的参数将被指定为位置参数。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('-f','--foo')
      >>> parser.add_argument('bar')
      >>> parser.parse_args(['BAR'])
      Namespace(bar='BAR', foo=None)
      >>> parser.parse_args(['BAR','--foo','FOO'])
      Namespace(bar='BAR', foo='FOO')
      >>> parser.parse_args(['--foo','FOO'])
      usage: PROG [-h][-f FOO] bar
      PROG: error: too few arguments
      复制代码
        2.action
            action参数指定了参数是如何被处理的。支持额操作如下:
            store:这个只是简单的存储这个参数值,这也是默认操作。
    1. >>> parser=argparse.ArgumentParser()
      >>> parser.add_argument('--foo')
      >>> parser.parse_args('--foo 1'.split())
      Namespace(foo='1')
            store_const:存储const指定的值。
    1. >>> parser=argparse.ArgumentParser()
      >>> parser.add_argument('--foo',action='store_const',const=42)
      >>> parser.parse_args('--foo'.split())
      Namespace(foo=42)
            store_false和store_true:分别对应存储True和False值。它们是store_const的特例。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', action='store_true')
      >>> parser.add_argument('--bar', action='store_false')
      >>> parser.parse_args('--foo --bar'.split())
      Namespace(bar=False, foo=True)
            append:保存为列表格式,将每个参数的值添加到这个列表。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', action='append')
      >>> parser.parse_args('--foo 1 --foo 2'.split())
      Namespace(foo=['1','2'])
            append_const:保存为列表,但是值必须是const指定参数的值。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--str', dest='types', action='append_const', const=str)
      >>> parser.add_argument('--int', dest='types', action='append_const', const=int)
      >>> parser.parse_args('--str --int'.split())
      Namespace(types=[<type 'str'>,<type 'int'>])
            version:需要指定version参数,当调用add_argument方法时,会打印版本信息并退出。
    1. >>>import argparse
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
      >>> parser.parse_args(['--version'])
      PROG 2.0
             你也可以通过继承Action类来实现自定义action类型,通过继承argparse.action,并提供__call__()方法,提供四个参数。
             parser:ArgumentParser对象。
             namespace:parse_args()返回的命名空间。
              values:相关联的命令行参数
             option_string:可选字符串,用来触发action,如果没有指定,就通过位置参数来关联。
    1. 复制代码
      >>> classFooAction(argparse.Action):
      ...    def__call__(self,parser,namespace,values,option_string=None):
      ...        print'%r%r%r'%(namespace,values,option_string)
      ...        setattr(namespace,self.dest,values)
      ...
      >>> parser=argparse.ArgumentParser()
      >>> parser.add_argument('--foo',action=FooAction)
      >>> parser.add_argument('bar',action=FooAction)
      >>> args=parser.parse_args('1 --foo 2'.split())
      Namespace(bar=None, foo=None)'1'None
      Namespace(bar='1', foo=None)'2''--foo'
      >>> args
      Namespace(bar='1', foo='2')
      复制代码
             3.nargs
             nargs参数将几个不同的参数跟action关联,支持的值如下:
             N(一个整数):N个从命令行中获取的参数将会组成一个列表。 
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', nargs=2)
      >>> parser.add_argument('bar', nargs=1)
      >>> parser.parse_args('c --foo a b'.split())
      Namespace(bar=['c'], foo=['a','b'])
      Note that ``nargs=1`` produces a list of one item.Thisis different from
      the default,in which the item is produced by itself.
      复制代码
            "?":从命令行参数中获取一个值,如果没有任何参数提供,则会使用default提供的默认值,注意对于可选参数的一种特殊情况,可选字符串提供了,但是后面没有接参数,这时会使用const值。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', nargs='?', const='c', default='d')
      >>> parser.add_argument('bar', nargs='?', default='d')
      >>> parser.parse_args('XX --foo YY'.split())
      Namespace(bar='XX', foo='YY')
      >>> parser.parse_args('XX --foo'.split())
      Namespace(bar='XX', foo='c')
      >>> parser.parse_args(''.split())
      Namespace(bar='d', foo='d')
      复制代码
            另外一种情况是通过?来支持可选的输入输出文件。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
      >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
      >>> parser.parse_args(['input.txt','output.txt'])
      Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>, outfile=<open file 'output.txt', mode 'w' at 0x...>)
      >>> parser.parse_args([])
      Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>, outfile=<open file '<stdout>', mode 'w' at 0x...>)
      复制代码
             "*":支持多个参数值。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', nargs='*')
      >>> parser.add_argument('--bar', nargs='*')
      >>> parser.add_argument('baz', nargs='*')
      >>> parser.parse_args('a b --foo x y --bar 1 2'.split())
      Namespace(bar=['1','2'], baz=['a','b'], foo=['x','y'])
            "+" :跟*的作用类似,但是如果没有提供参数的会报错。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('foo', nargs='+')
      >>> parser.parse_args('a b'.split())
      Namespace(foo=['a','b'])
      >>> parser.parse_args(''.split())
      usage: PROG [-h] foo [foo ...]
      PROG: error: too few arguments
      复制代码
            如果没有提供nargs参数的话,参数个数将由action来决定,默认情况下同单个参数。
            4.const
    
    
            const保存的值为不需要从命令行中读取但是对于ArgumentParser对象的action操作来说又必须的值。一般用于以下两个用途。
            当action='store_const'或者action="append_const"的时候
            当使用可选参数,并且narg=?的时候,并且命令行参数没有给出可选字符串以及可选参数的时候。
            5.default
            default设置默认值。如果可选参数没有提供可选字符串。则
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', default=42)
      >>> parser.parse_args('--foo 2'.split())
      Namespace(foo='2')
      >>> parser.parse_args(''.split())
      Namespace(foo=42)
        对于带nargs=?或者*的位置参数,当命令行参数没有提供的时候将使用默认值。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('foo', nargs='?', default=42)
      >>> parser.parse_args('a'.split())
      Namespace(foo='a')
      >>> parser.parse_args(''.split())
      Namespace(foo=42)
        如果提供default=argparse.SUPPRESS的话,这时不会有任何属性添加到命名空间。
        6.type
      
       默认情况下下,ArgumentParser将从命令行中读取的参数视为string类型,但是有时候也可以指定为其他类型。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('foo', type=int)
      >>> parser.add_argument('bar', type=file)
      >>> parser.parse_args('2 temp.txt'.split())
      Namespace(bar=<open file 'temp.txt', mode 'r' at 0x...>, foo=2)
            为了简便文件参数的使用,argparser模块提供了FileType类工厂。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('bar', type=argparse.FileType('w'))
      >>> parser.parse_args(['out.txt'])
      Namespace(bar=<open file 'out.txt', mode 'w' at 0x...>)
            type属性还可以接收一个回调函数,这个回调函数接收一个命令行参数并返回转换类型之后的值 
    1. 复制代码
      >>>def perfect_square(string):
      ... value = int(string)
      ... sqrt = math.sqrt(value)
      ... if sqrt != int(sqrt):
      ...     msg ="%r is not a perfect square"% string
      ...     raise argparse.ArgumentTypeError(msg)
      ... return value
      ...
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('foo', type=perfect_square)
      >>> parser.parse_args('9'.split())
      Namespace(foo=9)
      >>> parser.parse_args('7'.split())
      usage: PROG [-h] foo
      PROG: error: argument foo:'7'isnot a perfect square
      复制代码
            如果提供choices参数的话,可以检测值的范围。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('foo', type=int, choices=xrange(5,10))
      >>> parser.parse_args('7'.split())
      Namespace(foo=7)
      >>> parser.parse_args('11'.split())
      usage: PROG [-h]{5,6,7,8,9}
      PROG: error: argument foo: invalid choice:11(choose from5,6,7,8,9)
      复制代码
        7.choices
        有时候需要限制参数在某个范围之内,这时可以通过choices提供这个参数范围,如果提供的参数值不在这个范围之内,那么会报错。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('foo', choices='abc')
      >>> parser.parse_args('c'.split())
      Namespace(foo='c')
      >>> parser.parse_args('X'.split())
      usage: PROG [-h]{a,b,c}
      PROG: error: argument foo: invalid choice:'X'(choose from'a','b','c')
      复制代码
        注意,如果包含type参数的话,只有type参数的条件满足之后才会检查给定的参数值是否在choices之内。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='PROG')
      >>> parser.add_argument('foo', type=complex, choices=[1,1j])
      >>> parser.parse_args('1j'.split())
      Namespace(foo=1j)
      >>> parser.parse_args('-- -4'.split())
      usage: PROG [-h]{1,1j}
      PROG: error: argument foo: invalid choice:(-4+0j)(choose from1,1j)
      复制代码
        所有支持in运算符的对象都可以赋给choices,所以dict、set、list都可以。
        8.required
        一般情况下,argparse模块将带"-"前缀(例如-f)或者带"--"前缀的(例如--bar)的参数视为可选参数,,为了使可选参数变成必须参数,可以设置required值为True。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', required=True)
      >>> parser.parse_args(['--foo','BAR'])
      Namespace(foo='BAR')
      >>> parser.parse_args([])
      usage: argparse.py [-h][--foo FOO]
      argparse.py: error: option --foo is required
      复制代码
        如果设置了required为真,并且也没有提供这个参数值,则报错。
        9.help
        当用户使用-h 或者--help参数时,显示额帮助信息。
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='frobble')
      >>> parser.add_argument('--foo', action='store_true',
      ... help='foo the bars before frobbling')
      >>> parser.add_argument('bar', nargs='+',
      ... help='one of the bars to be frobbled')
      >>> parser.parse_args('-h'.split())
      usage: frobble [-h][--foo] bar [bar ...]
      positional arguments:
      bar one of the bars to be frobbled
      optional arguments:
      -h,--help show this help message and exit
      --foo foo the bars before frobbling
      复制代码
        help中可以使用格式化信息。例如
    1. 复制代码
      >>> parser = argparse.ArgumentParser(prog='frobble')
      >>> parser.add_argument('bar', nargs='?', type=int, default=42,
      ... help='the bar to %(prog)s (default: %(default)s)')
      >>> parser.print_help()
      usage: frobble [-h][bar]
      positional arguments:
      bar the bar to frobble (default:42)
      optional arguments:
      -h,--help show this help message and exit
      复制代码
        10.metavar
        当ArgumentParser生成帮助信息的时候,它需要通过某种方式来引用参数,对于位置参数,参数直接引用,对于可选参数,将其转换成大写再引用。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo')
      >>> parser.add_argument('bar')
      >>> parser.parse_args('X --foo Y'.split())
      Namespace(bar='X', foo='Y')
      >>> parser.print_help()
      usage:[-h][--foo FOO] bar
      positional arguments:
      bar
      optional arguments:
      -h,--help show this help message and exit
      --foo FOO
      复制代码
        除此之外,还可以通过metavar指定别名。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', metavar='YYY')
      >>> parser.add_argument('bar', metavar='XXX')
      >>> parser.parse_args('X --foo Y'.split())
      Namespace(bar='X', foo='Y')
      >>> parser.print_help()
      usage:[-h][--foo YYY] XXX
      positional arguments:
      XXX
      optional arguments:
      -h,--help show this help message and exit
      --foo YYY
      复制代码
            注意metavar只改变显示的名字,不同的nargs参数值,可能导致metavar参数需要使用多次,这时可以提供metavar参数来生成不同的显示。
    1. 复制代码
      1 >>> parser = argparse.ArgumentParser(prog='PROG')
      2 >>> parser.add_argument('-x', nargs=2)
      3 >>> parser.add_argument('--foo', nargs=2, metavar=('bar','baz'))
      4 >>> parser.print_help()
      5 usage: PROG [-h][-x X X][--foo bar baz]
      6 optional arguments:
      7 -h,--help show this help message and exit
      8 -x X X
      9 --foo bar baz
      复制代码
        11.dest
        ArgumentParser对象通过dest来指定要传入的参数值。
    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('bar')
      >>> parser.parse_args('XXX'.split())
      Namespace(bar='XXX')
            对于可选参数,dest的值根据可选参数的不同而相应改变,如果是完整字符串,使用去掉--前缀之后的字符串,如果是简短名,则使用去除-前缀之后的字符串,如果字符串中间带有-,则将-替换成_以使这个字符串合法。
    1. 复制代码
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('-f','--foo-bar','--foo')
      >>> parser.add_argument('-x','-y')
      >>> parser.parse_args('-f 1 -x 2'.split())
      Namespace(foo_bar='1', x='2')
      >>> parser.parse_args('--foo 1 -y 2'.split())
      Namespace(foo_bar='1', x='2')
      复制代码

            dest允许设置自定义名字:

    1. >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', dest='bar')
      >>> parser.parse_args('--foo XXX'.split())
      Namespace(bar='XXX')
    以前-好记性不如烂笔头 现在-好记性不如烂键盘
  • 相关阅读:
    angularjs 判断是否包含 permIDs|filter:'10'
    js日期格式化
    JSON格式检验
    CodeSmith Generator 6.5
    Hosts文件说明
    正则表达式匹配换行实例代码
    Codeforces 311E Biologist
    URAL 1349 Farm
    [SDOI2015] 序列统计
    洛谷 P3803 多项式乘法
  • 原文地址:https://www.cnblogs.com/gexbooks/p/8675150.html
Copyright © 2011-2022 走看看