2

Using python's argparse module I want to pass parameters to prog two ways:

Method 1:

./filter.py filename --start_regex "^FOO" --end_regex "BAR$" --contains "XXX" --bunch_of_common_options

Method 2:

./filter.py filename --type "FOO_BAR_XXX" --bunch_of_common_options

Logically both are doing exactly the same, because there is a dict in filter.py that translates "FOO_BAR_XXX" type from method 2 to appropriate options for method 1.

I want to specify that, given:

groupA = (--start_regex, --end_regex --contains)

groupB = (--type)

groupA and groupB are:

  1. mutually exclusive, and
  2. groupA must have at least start_regex defined

Now, I'm aware of mutually_exclusive_group functionality, but it works only on single arguments (not groups of options), and sub-commands, but it looks like I would have to have some kind of dispatch option after prog.py, like "git clone --help", or "git push --help" (this post proves that)

Note that it's not elegant to say:

./filter.py with_type filename --type TYPE1
./filter.py without_type filename --start_regex "^FOO" --end_regex "BAR$" --contains "XXX" 

Or am I missing something?

4

1 に答える 1

0

groups解析に大きな影響を与えません。レギュラーargument groupsは書式設定に影響を与えるhelpだけです (その目的のためにそのようなグループを定義したい場合があります)。相互に排他的なグループは、使用法フォーマットに影響を与え (ただし、独自のカスタム使用法の行を作成できます)、違反している場合はエラー メッセージを発行します。しかし、 の後parse_argsにそのようなテストを行うこともできますし、 を使用argparse.errorしてフォーマットされたエラー メッセージを生成することもできます。後で「相互に包括的な」テストを行うこともできます。

引数を複数の相互に排他的なグループに入れることを検討する「python issue」があります。この場合、グループ A 引数ごとに 1 つずつ、3 つのグループを作成し、それぞれに--type引数を入れることができます。その追加は簡単でした。意味のあるものをフォーマットするusageには、より多くの作業が必要でした。リンクされたSOの問題を参照してください。

後で独自のテストを行うことが最良の選択だと思います。


他のいくつかのオプション:

カスタム アクションまたはアクションを記述します。たとえば、「regex_end」アクションは、名前空間に「regex_begin」値がまだないか、「type」値がある場合に反対することができます。「タイプ」アクションはそのフォーマットをチェックし、他のいずれかがすでに設定されている場合はオブジェクトを生成できます。しかし、post-parse_args の場合でも同じテストを行うことになります。

'--regex', nargs=3, metavar=('begin','end','content')引数。それは と相互に排他的である可能性があります--type。必要に応じてグループを指定することもできます。

于 2013-11-14T16:13:12.180 に答える