我試着去一個命令行內禁止同一參數出現次數,使用argparseargparse - 禁用同樣的觀點OCCURENCES
./python3 --argument1=something --argument2 --argument1=something_else
這意味着這應該產生一個錯誤,因爲參數1的值被重寫,默認情況下,argparse剛重寫值並繼續,就像沒有發生任何事情......有沒有什麼聰明的方法來禁用這種行爲?
我試着去一個命令行內禁止同一參數出現次數,使用argparseargparse - 禁用同樣的觀點OCCURENCES
./python3 --argument1=something --argument2 --argument1=something_else
這意味着這應該產生一個錯誤,因爲參數1的值被重寫,默認情況下,argparse剛重寫值並繼續,就像沒有發生任何事情......有沒有什麼聰明的方法來禁用這種行爲?
我不認爲有一種使用的原生方法,但幸運的是,提供了報告自定義錯誤的方法。最優雅的方式可能是定義一個自定義操作來檢查重複項(如果存在則退出)。
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.")
有測試或約束沒有內置。一個positional
參數將只處理一次,但標記(或optional
)可以,如你所說,重複。這可讓您通過append
或count
操作收集多個事件。
覆蓋操作對大多數人來說都是可以接受的。爲什麼用戶可能會多次使用該選項?爲什麼第一個應該比上一個更受歡迎?
自定義動作可能是最佳選擇。如果namespace[dest]
已具有非默認值,則可能會引發錯誤。或者這個動作可以爲命名空間添加一些其他的「重複」標誌。