2017-11-10 111 views
0

我有一個命令行腳本,我試圖運行,如果該值不存在,則將缺省值插入到名稱空間中,或者如果它存在,則採用提供的參數。如何子類argparse.Action添加自定義操作?

所以我想這樣做:

myscript.py --merge

會導致參數解析器命名空間看起來像這樣:

命名空間(合併= ' - 合併')

否則,如果我叫

myscript.py

命名空間應該是這樣的:

命名空間(合併=「DONTMERGE」)

我想我需要繼承argparse.Action類的呼叫方法來執行自定義操作如下規定:https://pymotw.com/2/argparse/但我我無法弄清楚如何做到這一點。

我覺得這樣的事情會做的伎倆:

class CustomAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     if isinstance(self.values, None): 
      self.values = 'NOMERGE' 
     else: 
      self.values = '--nomerge' 
     setattr(namespace, self.dest, values) 

不幸的是,我沒有得到預期的結果。

+1

爲什麼不只是使用'store_const'參數? – khelwood

+0

我試過store_const,問題是我將不得不提供一個額外的參數給--merge,就像myscript --merge someotherarg通過命令行提供的參數通過管道傳輸到另一個腳本,我無法改變其行爲。 –

+0

看看鏈接的文章,'setattr'調用應該縮進更深一層。 – FamousJameous

回答

3

我認爲你只需要一個正常的store_const參數。

parser.add_argument('--merge', action='store_const', const='MERGE', default='DONTMERGE') 

如果你打電話給你的腳本--merge,則merge參數取值MERGE(上面指定爲const)。否則,參數merge取值DONTMERGE(以上指定爲default)。

請參閱https://docs.python.org/2/library/argparse.html#action

+0

謝謝。我錯過了存儲默認值的可能性。這看起來好像已經成功了。 如果你有一個關於如何做這個與子類化的建議,那麼我會非常感謝指針。 –

相關問題