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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM