2017-08-10 8 views
0

で2つのoptionals私は、次の引数でプログラムを持っている:argparseパイソン1変数

  1. ファイル
  2. ディレクトリ
  3. 名1
  4. Name2は

ファイルは、いつものように渡す必要があります引数を指定すると、ディレクトリが存在していてもいなくても構いません。また、name1とname2は、それらのいずれも、または両方を同時に渡さなければなりません。

これは私がこの時点で持っているものです。

parser = argparse.ArgumentParser() 
parser.add_argument("file", help="The file") 
parser.add_argument("resources_dir", default='.', nargs='?', help="The directory of media files") 
parser.add_argument("name", nargs=2, help="names") 

ヘルプが表示されます。

使用:wacv [-h]ファイル[resources_dir]名前名

をと私はそれが欲しい:

使用法:wacvファイル[res_dir] [name1 name2]

しかし、私は前に言ったように '名前'の議論をしたい。どうすればこれを達成できますか?

+0

'names'が単なる文字列であると仮定すれば、' name1'がオプションの 'res_dir'ではないとどのように判断するでしょうか?(' res_dir'が与えられていないと仮定します)? '0または2'のセマンティクスを 'argparse'で直接実行する方法はありませんが、あなたは' * 'を受け入れて独自のエラーチェックを行うことができます。 – AChampion

+0

最後に私が決めたのは、名前に*を受け入れ、0か2かどうかを自分で確認した後ですが、もっと良い方法があるかどうかを知りたいのです。 – xBlackout

答えて

1

私はあなたがそれらはオプションになりますが、提供された場合、それは `「resources_dir」用のオプションのいずれかから、これらの2つの文字列を区切るも2が必要です

(`--names`, nargs=2) 

を使うべきだと思います。

nargs='*'を使用すると、0,1またはそれ以上の値を入力できます。しかし、2つの文字列はfiledirに割り当てられます。 3をファイル、ディレクトリ、および1つの名前などに置き換えることができます。つまり、オプションの文字列がdirまたはnamesに属するかどうかを内容で区別することはできません。それは厳密にポジションに入ります。

いずれにしても、前述した以外は0 or 2 nargsはありません。

+0

良い解決策です。私はそのようなものを探していた。私はまだそれのようにそれを行うには少し奇妙だと思うが、それは動作します。 – xBlackout

関連する問題