2017-11-15 4 views
1

ユーザーは、引数argまたは引数を引数として 'argparse'に必須引数を渡すことができます。Python argparse - 必須引数 - 位置指定またはオプションのいずれか

すなわち、 次の両方の形式が有効です。私は

Argparse optional positional arguments?を見てきましたが、提案があっ両方フォームをオプションに

my_prog arg 
my_prog -m arg 

。私はそのうちのが義務付けられることを望みます。

もちろん、少なくとも1つが設定されていることを解析した後、手動でチェックすることができます。しかし、私は、より良い解決策が必要であるという勘違いがあります。

(さらに私のマニュアル的なアプローチで、「ヘルプ」セクションでは、オプションとして、それらの両方を示している)

答えて

2

mutually exclusive groupメカニズムはrequiredパラメータを取ることができます。また、1つの?ポジションとオプション(フラグ付きの引数)と共に動作します。 (複数の '?'位置は意味をなさない)。

helpディスプレイには、2つのデフォルトグループpositonaloptionalがあります。したがって、optional(フラグが設定されている)がrequiredに設定されていても、デフォルトではoptionalグループに表示されます。引数が必要かどうかについては、usage行がより良いガイドです。ヘルプセクションのグループラベルが気に入らない場合は、独自の引数グループを定義してください。

In [146]: import argparse 
In [147]: parser = argparse.ArgumentParser() 
In [148]: gp = parser.add_mutually_exclusive_group(required=True) 
In [149]: gp.add_argument('pos', nargs='?', default='foo'); 
In [150]: gp.add_argument('-f','--foo', default='bar'); 

In [151]: parser.parse_args('arg'.split()) 
Out[151]: Namespace(foo='bar', pos='arg') 

In [152]: parser.parse_args('-f arg'.split()) 
Out[152]: Namespace(foo='arg', pos='foo') 

In [153]: parser.parse_args('arg -f arg'.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 
ipython3: error: argument -f/--foo: not allowed with argument pos 

In [154]: parser.parse_args(''.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 
ipython3: error: one of the arguments pos -f/--foo is required 


In [155]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 

positional arguments: 
    pos 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FOO, --foo FOO 

おっと、使用量が互いにEXLUSIVEグループにおける-fposを示していません。場合によってはusageの書式設定が脆いことがあります。引数が定義された順序を切り替える

は、ユーザー定義の引数グループでは、より良い使い方

In [156]: parser = argparse.ArgumentParser() 
In [157]: gp = parser.add_mutually_exclusive_group(required=True) 
In [158]: gp.add_argument('-f','--foo', default='bar'); 
In [159]: gp.add_argument('pos', nargs='?', default='foo'); 
In [160]: 
In [160]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] (-f FOO | pos) 

positional arguments: 
    pos 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FOO, --foo FOO 

を与える:

In [165]: parser = argparse.ArgumentParser() 
In [166]: gp = parser.add_argument_group('Mutually exclusive') 
In [167]: gpm = gp.add_mutually_exclusive_group(required=True) 
In [168]: gpm.add_argument('-f','--foo', default='bar'); 
In [169]: gpm.add_argument('pos', nargs='?', default='foo'); 
In [170]: 
In [170]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] (-f FOO | pos) 

optional arguments: 
    -h, --help   show this help message and exit 

Mutually exclusive: 
    -f FOO, --foo FOO 
    pos 

これは、一般的なルールargument_groupsとmutually_exclusive_groups唯一の例外でありますネスティング用に設計されていません。

メートル-X基を必要としないし、使用量が[]

+0

usage: ipython3 [-h] [-f FOO | pos] 
グレートを使用します。ちょうど1つの注意点:これらのグループ定義は他のすべての正規の引数の後になければなりません。そうでなければ、ヘルプにnice(-f FOO | pos)を表示しません。 – Zvika

+0

はい、2つのことが 'usage'に影響します。オプションはオプションの後に表示され、引数がその順序と一致する場合にのみグループが表示されます。脆性を修正するには、使用フォーマット作成プログラムを大幅に書き直す必要があります。 – hpaulj

関連する問題