docoptは、パターンを一致させようとすると貪欲になります。したがって、パターンが次の場合:
usage: http [METHOD] URL [ITEM...]
そして、実行する$ http google.com bla
と、docoptはとして一致google.com
しますMETHOD
。なぜなら、それが最初の位置引数だからです!この場合、docoptMETHOD
にはどのように見えるかを差し引くための情報がありません。ただし、次の使用法がある場合:
usage: http [get|post|put|delete] URL [ITEM...]
次に、そうでない場合はget/post/put/delete
、である必要があることを認識しURL
ます。ただし、これが最適ではないことがわかります。1. httpieは大文字の名前(docoptによるコマンドではなく、位置引数として解釈されます)を使用します。2。コマンドが多い場合、使用法は長い行になる可能性があります。
httpieとの互換性に関心がない場合は、コマンドは通常小文字であるため、(A)小文字のコマンドを使用します。互換性のない別の設計上の決定は、(B)次のものを要求することですMETHOD
。
usage: http METHOD URL [ITEM...]
このようにして、使用パターンを明確にします。(C)互換性を維持するために私が行うことは、次のように使用します。
usage: http URL [ITEM...]
http METHOD URL [ITEM...]
この場合、2番目のサブパターンは一致しません(docoptはURLとメソッドについて何も知らないため、最初のパターンが2番目のパターンのスーパーセットになります)。次に、引数を次のように分解します。
positional_arguments = [args['URL']] + args['ITEM']
positional_arguments
次に、最初の引数がurlのように見えるか、要求動詞のように見えるかに応じて、手動で解析します。
docoptがこのケースをエレガントに処理していないことを残念に思います。このユースケースについて詳しく考えます。何か提案があれば、問題を作成してください:https ://github.com/docopt/docopt/issues
PSあなたは正しいです、それREQUEST ITEM
は間違っていて、非常に型破りで混乱しています。REQUEST-ITEM
またはREQUEST_ITEM
または単にである必要がありますITEM
。