2016-10-11 6 views
1

ポジション引数またはオプションの引数として渡す必要のあるコマンドライン引数が必要です。たとえば、次のいずれかの呼び出しから同じアクションを実行したいとします。argparse:同じ必須引数をポジションORにする

prog 10 
prog -10 
prog -n 10 
prog --num 10 

これはargparseで可能ですか?

インタラクティブセッションで:私は合理的な近似を作成することができ、相互に排他的なグループと

答えて

0

In [10]: parser=argparse.ArgumentParser() 
In [11]: grp=parser.add_mutually_exclusive_group(required=True) 
In [12]: a=grp.add_argument('pos',nargs='?',type=int,default=0) 
In [13]: b=grp.add_argument('-n','--num') 

grpは任意optionalsの数と1つのオプションの位置を含むことができます。違いを強調しただけのポジションに別のtypeを選びました。必要

In [16]: parser.parse_args(['-n10']) 
Out[16]: Namespace(num='10', pos=0) 
In [17]: parser.parse_args(['--num=10']) 
Out[17]: Namespace(num='10', pos=0) 
In [18]: parser.parse_args(['--num','10']) 
Out[18]: Namespace(num='10', pos=0) 

試験グループ独占

In [25]: parser.parse_args(['--num=20','10']) 
usage: ipython3 [-h] [-n NUM] [pos] 
ipython3: error: argument pos: not allowed with argument -n/--num 

グループ:

だけ位置値:任意の

In [14]: parser.parse_args(['10']) 
Out[14]: Namespace(num=None, pos=10) 

様々な形態

In [26]: parser.parse_args([]) 
usage: ipython3 [-h] [-n NUM] [pos] 
ipython3: error: one of the arguments pos -n/--num is required 

私は同じ位置に同じdestを付けることを実験しました - したがって、両方ともnumに書きます。しかし、これがデフォルトでdestを書く上での位置になり

In [19]: a.dest 
Out[19]: 'pos' 
In [20]: a.dest='num' 
In [21]: parser.parse_args(['--num','10']) 
Out[21]: Namespace(num=0) 

郵便解析するコードが今まで道理にかなっているものの中にargs.posargs.num値を処理する必要があります(必要であれば、私は詳細を追加することができます)。

'-10 'の入力は処理できません。

parser.add_argument('-1') 

をしかし、結果はあなたが望むものはおそらくない:まあ、私は定義することができ

​​

は全体的に、この要件はあなたのために物事が不必要に困難なプログラマになります。

+0

ご回答ありがとうございます。私は '-10'形式の無駄についてあなたに同意します。私は投稿時にUNIXの 'tail'コマンドについて考えていましたが、それは非常に特殊な使い方であり、最後に余分なコーディングを行う価値はありません。私はあなたが提案したように相互排他的なグループの使用を考えましたが、それは位置とオプションの引数の明確な区別の 'argparse'の哲学(私はあまり好きではありません)を回避する方法です。結局、私が 'argparse'を保つことにしたら、オプションの引数形式(' -n'、 '--num')だけを使うつもりです。 – beppe

関連する問題