簡體   English   中英

argparse用法如何在中間顯示與parser.add_argument()的互斥選項?

[英]How have argparse usage show mutually exclusive options with parser.add_argument() in the middle?

如果我填充一個專門的相互argparse組,然后填充parser.add_argument(對於其他項),則該用法將獨占互相組中的參數顯示為互斥:

import argparse

parser1 = argparse.ArgumentParser()
group1 = parser1.add_mutually_exclusive_group()
group1.add_argument('--start')
group1.add_argument('--stop')
group1.add_argument('--restart')
parser1.add_argument('--os')
parser1.print_usage()

輸出:

usage: arg_usage.py [-h] [--start START | --stop STOP | --restart RESTART] [--os OS]

但是,如果我在組的中間向解析器添加非互斥參數,則使用輸出不再反映某些參數是互斥的這一事實:

import argparse

parser2 = argparse.ArgumentParser()
group2 = parser2.add_mutually_exclusive_group()
group2.add_argument('--start')
group2.add_argument('--stop')
parser2.add_argument('--os')
group2.add_argument('--restart')
parser2.print_usage()

輸出:

usage: arg_usage.py [-h] [--start START] [--stop STOP] [--os OS]
                [--restart RESTART]

有沒有辦法解決這個問題,而無需手動提供使用字符串或重新訂購電話?

附加說明 - 我發現在將混合類型添加到互斥組(位置和可選)時會出現相同的問題(用法並不表示互斥選項)。

附加?:這些錯誤應該提交到http://bugs.python.org/嗎?

如果您不希望它們按順序列在usage中,那么為什么要將parser參數放在group參數的中間? 由於可以按任何順序解析optionals ,因此usage是以任何特定順序定義它們的唯一原因。

這是parser.format_usage如何生成usage行的結果。 它按照您定義它們的順序列出參數,只進行一次修改 - 在選項后面列出了位置。 只有當它們可以疊加在此定義的順序上時,它才包含互斥的組標記。

如果您的組包含一組選項和一個位置(組中不能有多個位置),那么只有當該位置緊跟在選項后面時才會標記該組。

有一個錯誤請求,可以將現有參數添加到新的互斥組。 http://bugs.python.org/issue10984 這很容易做到。 但是,正確使用是很困難的。 如果參數屬於多個組,則不能在不重復參數的情況下顯示這兩個組。 這促使我重寫了使用格式化程序。 在此備用版本中,每個組都已格式化,根據需要重復參數。

簡而言之,更改此格式化行為需要重寫用法代碼。 在修補之前,您必須決定編寫自己的usage線。 這樣,您就可以優先於定義順序提供組優先順序。

看看http://bugs.python.org/issue11588當你想要嵌套組並包含“xor”以外的邏輯時(例如,相互包含的組),你想要解決格式化使用的更艱巨的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM