2014-04-12 30 views
3

我試着去一個命令行內禁止同一參數出現次數,使用argparseargparse - 禁用同樣的觀點OCCURENCES

./python3 --argument1=something --argument2 --argument1=something_else 

這意味着這應該產生一個錯誤,因爲參數1的值被重寫,默認情況下,argparse剛重寫值並繼續,就像沒有發生任何事情......有沒有什麼聰明的方法來禁用這種行爲?

回答

6

我不認爲有一種使用​​的原生方法,但幸運的是,​​提供了報告自定義錯誤的方法。最優雅的方式可能是定義一個自定義操作來檢查重複項(如果存在則退出)。

class UniqueStore(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string): 
     if getattr(namespace, self.dest, self.default) is not None: 
      parser.error(option_string + " appears several times.") 
     setattr(namespace, self.dest, values) 

parser = argparse.ArgumentParser() 
parser.add_argument('-f', '--foo', action=UniqueStore) 

args = parser.parse_args() 

(閱讀docs關於對自定義操作)

另一種方法是使用附加動作和統計列表的LEN。

parser = argparse.ArgumentParser() 
parser.add_argument('-f', '--foo', action='append') 
args = parser.parse_args() 

if len(args.foo) > 1: 
    parser.error("--foo appears several times.") 
2

有測試或約束沒有內置。一個positional參數將只處理一次,但標記(或optional)可以,如你所說,重複。這可讓您通過appendcount操作收集多個事件。

覆蓋操作對大多數人來說都是可以接受的。爲什麼用戶可能會多次使用該選項?爲什麼第一個應該比上一個更受歡迎?

自定義動作可能是最佳選擇。如果namespace[dest]已具有非默認值,則可能會引發錯誤。或者這個動作可以爲命名空間添加一些其他的「重複」標誌。