2016-04-04 68 views
0

Julia的ArgParse允許爲每個命令行參數傳遞一個函數,該函數將檢查傳遞的參數是否可接受(請參見:http://argparsejl.readthedocs.org/en/latest/argparse.html?highlight=range_tester)。例如,這有用於將傳遞的參數數值參數限制爲正數。Python的argparse中Julia的ArgParse range_teser等價嗎?

可以通過在解析後手動檢查參數來做到這一點,但我認爲range_tester方法更清晰。 Python的argparse中是否有等價的功能性?我沒有找到它。

回答

3

嘗試使用type參數add_argument。它可以採取任何可調用的。請參閱perfect_square的示例以獲取靈感。

下面的程序創建一個type接受在特定範圍內的值,而無需使用choice(用於大範圍也許良好):

import argparse 

parser = argparse.ArgumentParser() 

def int_range(start, end): 
    def range_type(arg): 
     try: 
      val = int(arg) 
     except ValueError: 
      raise argparse.ArgumentTypeError("Invalid value for range (%d, %d): %r" % (start, end, arg)) 
     if val not in range(start, end): 
      raise argparse.ArgumentTypeError("%d not in range (%d, %d)" % (val, start, end)) 
     return val 
    return range_type 

parser.add_argument('--foo', type=int_range(10, 100)) 

args = parser.parse_args() 

print("Foo is %d" % args.foo) 

輸出:

> python argparse_type.py --foo 0 
usage: argparse_type.py [-h] [--foo FOO] 
argparse_type.py: error: argument --foo: 0 not in range (10, 100) 
> python argparse_type.py --foo bar 
usage: argparse_type.py [-h] [--foo FOO] 
argparse_type.py: error: argument --foo: Invalid value for range (10, 100): 'bar' 
> python argparse_type.py --foo 50 
Foo is 50 

注意,一個轉換失敗時引發argparse.ArgumentTypeError。這樣,argparse可以顯示幫助屏幕和自定義錯誤消息。如果改爲ValueError而不是int內建,則會顯示一條默認消息,而不是「invalid int value:...」。

+0

更新,刪除了黑客。 –