Mark Roddy のソリューションは機能しますが、実行時にパーサー オブジェクトの属性を変更する必要があり、- または -- 以外の代替オプション形式はサポートされていません。少し複雑な解決策は、optparse を実行する前に sys.argv 配列を変更し、引数を必要としないスイッチの後に空の文字列 ("") を挿入することです。この方法の唯一の制約は、sys.argv に挿入する値以外の予測可能な値にオプションをデフォルト設定することです (以下の例では [なし] を選択しましたが、実際には問題ありません)。
次のコードは、パーサーの例とオプションのセットを作成し、許可されたスイッチの配列をパーサーから抽出し (インスタンス変数マジックを少し使用して)、sys.argv を反復処理し、許可されたスイッチが見つかるたびに、その後に引数を指定せずに指定されたかどうかをチェックします。スイッチの後に引数がない場合、空の文字列がコマンド ラインに挿入されます。sys.argv を変更した後、パーサーが呼び出され、値が "" であるオプションをチェックし、それに応じて動作することができます。
#Instantiate the parser, and add some options; set the options' default values to None, or something predictable that
#can be checked later.
PARSER_DEFAULTVAL = None
parser = OptionParser(usage="%prog -[MODE] INPUT [options]")
#This method doesn't work if interspersed switches and arguments are allowed.
parser.allow_interspersed_args = False
parser.add_option("-d", "--delete", action="store", type="string", dest="to_delete", default=PARSER_DEFAULTVAL)
parser.add_option("-a", "--add", action="store", type="string", dest="to_add", default=PARSER_DEFAULTVAL)
#Build a list of allowed switches, in this case ['-d', '--delete', '-a', '--add'] so that you can check if something
#found on sys.argv is indeed a valid switch. This is trivial to make by hand in a short example, but if a program has
#a lot of options, or if you want an idiot-proof way of getting all added options without modifying a list yourself,
#this way is durable. If you are using OptionGroups, simply run the loop below with each group's option_list field.
allowed_switches = []
for opt in parser.option_list:
#Add the short (-a) and long (--add) form of each switch to the list.
allowed_switches.extend(opt._short_opts + opt._long_opts)
#Insert empty-string values into sys.argv whenever a switch without arguments is found.
for a in range(len(sys.argv)):
arg = sys.argv[a]
#Check if the sys.argv value is a switch
if arg in allowed_switches:
#Check if it doesn't have an accompanying argument (i.e. if it is followed by another switch, or if it is last
#on the command line)
if a == len(sys.argv) - 1 or argv[a + 1] in allowed_switches:
sys.argv.insert(a + 1, "")
options, args = parser.parse_args()
#If the option is present (i.e. wasn't set to the default value)
if not (options.to_delete == PARSER_DEFAULTVAL):
if options.droptables_ids_csv == "":
#The switch was not used with any arguments.
...
else:
#The switch had arguments.
...