我正试图用docopt实现HTTPie的CLI,但由于某种原因,我无法将METHOD作为第一个参数。我已经删除了隔离此问题的大多数选项。
此外,HTTPie的作者获取REQUEST ITEM的方式似乎与docopt文档不一致,所以想知道实现该部分的最佳替代方案是什么。
HTTPie的完整文档:https://github.com/jkbr/httpie
我的docopt示例:https://gist.github.com/dasickis/4711926
docopt在尝试匹配模式时是贪婪的。所以如果你的模式是:
usage: http [METHOD] URL [ITEM...]
如果运行$ http google.com bla
,那么docopt将把google.com
匹配为METHOD
,因为,哟,这是第一个位置参数docopt在这种情况下没有任何信息可以推断METHOD
应该是什么样子。但是,如果您有以下用法:
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...]
在这种情况下,第二个子模式将永远不会匹配(docopt对url和方法一无所知,这使得第一个模式成为第二个模式的超集),然后我将参数分解为:
positional_arguments = [args['URL']] + args['ITEM']
然后手动解析positional_arguments
,这取决于第一个参数看起来像url还是像请求动词。
很抱歉,docopt没有很好地处理这个用例,我会详细考虑这个用例。如果您有任何建议,请创建一个问题:https://github.com/docopt/docopt/issues
p。S.你说得对,REQUEST ITEM
是错误的,非常不传统,令人困惑。它应该是REQUEST-ITEM
或REQUEST_ITEM
,或者仅仅是ITEM
。