2016-09-01 7 views
0

私はプログラムのすべてのオプションを印刷したいと思います。それらは読みやすくするためにグループ化されています。しかし、vars(args)で引数にアクセスする場合、順序はランダムです。argparseの引数を定義した順序で取得する方法はありますか?

+0

argparseを考慮すると、それがPOSIX標準に準拠するように設計されているようなことは本当に疑わしいです。指定された順序は問題ではありません。あなたはおそらく 'sys.argv'を使ってそれを行うことができますが、それらは解析されません。 –

+0

引数がコマンドラインで表示される順序や、 'add_argument'で作成される順序に興味がありますか? – hpaulj

答えて

2

​​は(sys.argv[0]usageprog値として使用される)sys.argv[1:]の引数のリストを解析します。

args=parser.parse_args()は、argparse.Namespaceオブジェクトを返します。 vars(args)は、このオブジェクト(args.__dict__)に基づいて辞書を返します。辞書のキーは順不同です。 print(args)もこの辞書の順序を使用します。

パーサは、独自の簿記のために見た行動の記録を保持します。しかし、それはユーザーに公開されておらず、順序付けられていないsetです。そのインスタンスが使用された順序を記録したカスタムサブクラスActionを定義すると思います。


パーサの作成時に定義された順序で引数を取り出すことができます。これは、parser_actionsのリストがすべてActionsであるためです。これはパブリックAPIの一部ではなく、基本的な属性であり、すべてが消滅する可能性は低いです。

は説明するために:

In [622]: parser=argparse.ArgumentParser() 
In [623]: parser.add_argument('foo') 
In [624]: parser.add_argument('--bar') 
In [625]: parser.add_argument('--baz') 

In [626]: parser.print_help() 
usage: ipython3 [-h] [--bar BAR] [--baz BAZ] foo 

positional arguments: 
    foo 

optional arguments: 
    -h, --help show this help message and exit 
    --bar BAR 
    --baz BAZ 

使用方法とヘルプのリストが分離されているpositionalsoptionalsことを除いて、それが定義された順序で引数を示しています。

In [627]: args=parser.parse_args(['--bar','one','foobar']) 
In [628]: args 
Out[628]: Namespace(bar='one', baz=None, foo='foobar') 
In [629]: vars(args) 
Out[629]: {'bar': 'one', 'baz': None, 'foo': 'foobar'} 

In [631]: [(action.dest, getattr(args,action.dest, '***')) for action in parser._actions] 
Out[631]: [('help', '***'), ('foo', 'foobar'), ('bar', 'one'), ('baz', None)] 

は、ここで私は_actionsリストに、各Actionについてdestを取得し、args名前空間からその値をフェッチ繰り返します。私はvars(args)辞書からそれを取り出すこともできました。

アクションが名前空間に表示されないため、getattrにデフォルトの***を指定する必要がありました。私は、そのような種類の行動をディスプレイから除外することができました。

関連する問題