在docopt中实现HTTPie



我正试图用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-ITEMREQUEST_ITEM,或者仅仅是ITEM

相关内容

  • 没有找到相关文章

最新更新