12813


Pythonの引数解析に`docopt`を使おうと思ったのですが、思うように取得できません。

[code]

    from docopt import docopt
    
    __doc__ = """{f}
    Usage:
        {f} [[-w | --word-list] <word_list>...] [[-d | --data-list] <data_list>...]
    """.format(f=__file__)
    
    
    def main():
        args = docopt(__doc__)
        print(args)
    
    
    if __name__ == '__main__':
        main()
    
[/code]

これを実行すると、期待通りにはデータが入ってくれません。

[code]

    $ python option_test.py --word-list word1 word2 --data-list data1 data2
    {'--data-list': True,
     '--word-list': True,
     '-d': False,
     '-w': False,
     '<data_list>': [],
     '<word_list>': ['word1', 'word2', 'data1', 'data2']}
    
[/code]

期待する動きとしては`data_list`には`data`が、`word_list`には`word`が入って欲しいのですが･･･

[code]

    こうなって欲しい
    $ python option_test.py --word-list word1 word2 --data-list data1 data2
    {'--data-list': True,
     '--word-list': True,
     '-d': False,
     '-w': False,
     '<data_list>': ['data1', 'data2'],
     '<word_list>': ['word1', 'word2']}
    
[/code]

上記のようなオプション指定はそもそも不可能なのでしょうか。


CC BY-SA 3.0
2015-07-29T06:12:52.500
12788
2015-07-30T00:42:35.050
7214
question
python
Python: docoptで複数の引数を一つのオプションで取得したい


どうも質問で書かれているようにして期待するようにはできないみたいですね。  
でも、

[code]

    Usage:
        {f} [-w <word_list>...] [-d <data_list>...]
    
    Options:
      -w --word-list <word_list>...   Word List.
      -d --data-list <data_list>...   Data List.
    
[/code]

の様にして

[code]

    -w word1 -w word2 --data-list data1 -d data2
    
[/code]

（長いオプションでも短いオプションでも同じオプションを意味する）  
の様に引数を渡すと

[code]

    {'--data-list': ['data1', 'data2'],
     '--word-list': ['word1', 'word2']}
    
[/code]

の結果が得られます。


CC BY-SA 3.0
2015-07-29T12:16:42.233
12806
2015-07-29T12:16:42.233
5044
12788
answer


オプションパラメータの個数を固定してもよいのであれば、以下の様に書けます(パラメータは2個)。

[code]

    {f} [-w WORD WORD|--word-list WORD WORD] [-d DATA DATA|--data-list DATA DATA]
    
[/code]

実行結果です。

[code]

    $ python option_test.py --word-list word1 word2 --data-list data1 data2
    {'--data-list': True,
     '--word-list': True,
     '-d': False,
     '-w': False,
     'DATA': ['data1', 'data2'],
     'WORD': ['word1', 'word2']}
    
[/code]

最初は以下の様に書けるのではないかと思ったのですが、

[code]

    {f} [[-w|--word-list] WORD WORD] [[-d|--data-list] DATA DATA]
    
[/code]

`--data-list` だけを指定すると結果がおかしくなってしまいます。

[code]

    $ python option_test.py --data-list 3 4
    {'--data-list': True,
     '--word-list': False,
     '-d': False,
     '-w': False,
     'DATA': [],
     'WORD': ['3', '4']}
    
[/code]


CC BY-SA 3.0
2015-07-29T15:48:37.933
12810
2015-07-29T15:48:37.933
12788
answer


上記のオプションではできそうにないようですので、カンマ区切りまたはスペース区切りで一つの変数として渡し、その後`split`することにしました。

[code]

    from docopt import docopt
    
    __doc__ = """{f}
    Usage:
        {f} [-w <word_list>] [-d <data_list>]
    
    Options:
        -w --word-list <word_list>  Setting words.
        -d --data-list <data_list>  Setting datas.
    """.format(f=__file__)
    
    
    def main():
        args = docopt(__doc__)
        print(args)
        word_list = args['--word-list'].split(',') # スペース区切りの場合は' '
        print(word_list)
        data_list = args['--data-list'].split(',') # スペース区切りの場合は' '
        print(data_list)
    
    if __name__ == '__main__':
        main()
    
[/code]

実行結果

[code]

    $ python option_test.py --word-list word1,word2 --data-list data1,data2
    {'--data-list': 'data1,data2',
     '--word-list': 'word1,word2'}
    ['word1', 'word2']
    ['data1', 'data2']
    
[/code]

スペース区切りの場合

[code]

    $ python option_test.py --word-list "word1 word2" --data-list "data1 data2"
    {'--data-list': 'data1 data2',
     '--word-list': 'word1 word2'}
    ['word1', 'word2']
    ['data1', 'data2']
    
[/code]


CC BY-SA 3.0
2015-07-30T00:20:59.343
12813
2015-07-30T00:42:35.050
2015-07-30T00:42:35.050
7214
7214
12788
answer