6.20.3.6 オプション間の衝突

注意が足りないと、衝突するオプションを定義しやすくなります:

parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)

(標準的なオプションを実装済みの OptionParser から自前の サブクラスを定義した場合にはさらによく起きます)

optparse はこのような定義は通常間違いによるものだと仮定 しており、デフォルトでは例外 (OptionConflictError) を 送出します。この誤りは簡単に修正できるプログラム上のエラーなので、 例外を catch しようとしないほうがせず -- 間違いを直しておくべき です。

時に、故意に新たなオプションで以前のオプションを置き換えたいこと があります。これは以下の呼び出し:

parser.set_conflict_handler("resolve")

で行えます。この操作は optparse にオプションの衝突を 賢く解決するよう指示します。

からくりはこうなっています: オプションを追加するたびに、 optparse は以前に追加されたオプションとの衝突がないか 調べます。何らかの衝突が見つかると、OptionParser の コンストラクタでの指定:

parser = OptionParser(..., conflict_handler="resolve")

か、set_conflict_handler() で指定されたいずれかの衝突処理 機構 (conflict-handling mechanism ) が起動されます。

デフォルトの衝突処理メカニズムは ``error'' です。その他の唯一の 選択肢は ``ignore'' で、これはバージョン 1.1 またはそれ以前の optparse の (おそらく壊れている) 挙動を修正します。

以下に例を示します: まず、衝突を解決するように設定された OptionParser を定義しましょう:

parser = OptionParser(conflict_handler="resolve")

ここでオプションを全て定義します:

parser.add_option("-n", "--dry-run", ..., help="original dry-run option")
...
parser.add_option("-n", "--noisy", ..., help="be noisy")

この時点で、optparse は以前に追加されたオプションで すでに -n オプション文字列が使用されていることを 検出します。conflict_handler == "resolve" であるため、 この状況は -n を以前のオプションにおけるオプション 文字列リストから削除することによって解決します。こうして、 以前のオプションを有効にする方法は --dry-run だけと なります。ユーザがヘルプメッセージを要求すると、ヘルプ文字列は 上の結果を反映します。例えば以下のようになります:

options:
  --dry-run     original dry-run option
  ...
  -n, --noisy   be noisy

以前に追加されたオプション文字列を切り詰めていって何も残らない ようにすることは可能ですが、そのオプションをコマンドラインから 起動する手段がなくなってしまうので注意してください。この場合、 optparse はオプションを完全に除去してしまうので、 こうしたオプションはヘルプテキストやその他のいずれにも表示 されなくなります。例えば、現在の OptionParser で 続けると:

parser.add_option("--dry-run", ..., help="new dry-run option")

この操作を行った時点で、最初の -n/--dry-run オプションはもはやアクセスできなくなり、optparse は 最初のオプションを除去します。ユーザがヘルプを要求すると、 以下のようなヘルプ:

options:
  ...
  -n, --noisy   be noisy
  --dry-run     new dry-run option

を読むことになるでしょう。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。