在docopt中实现HTTPie

时间:2013-02-05 03:29:58

标签: python command-line-interface httpie docopt

我正在尝试使用docopt实现HTTPie的CLI,但由于某种原因,我无法将METHOD作为第一个参数。我删除了大多数选项以隔离此问题。

此外,HTTPie的作者获取REQUEST ITEM的方式似乎与docopt文档有关,因此想知道实现该文章的最佳替代方法是什么。

HTTPie的完整文档:https://github.com/jkbr/httpie

我的docopt示例:https://gist.github.com/dasickis/4711926

1 个答案:

答案 0 :(得分:2)

尝试匹配模式时,

docopt 是贪婪的。所以如果你的模式是:

usage: http [METHOD] URL [ITEM...]

你运行$ http google.com bla然后docopt将google.comMETHOD匹配,因为,哟,这是第一个位置参数!在这种情况下, docopt 没有信息可以扣除METHOD的外观。但是,如果您有以下用法:

usage: http [get|post|put|delete] URL [ITEM...]

然后它知道如果它不是get/post/put/delete,那么它应该是URL。但是,我可以看到这不是最优的:1。httpie使用大写名称(被解释为位置参数,而不是docopt的命令),2。如果有很多命令,则使用可能会变成一条长行。 / p>

如果你不关心与httpie的兼容性,我会选择(A)小写命令,因为命令按照惯例小写。另一个不兼容的设计决定是(B)需要METHOD

usage: http METHOD URL [ITEM...]

这样,您可以使用模式不含糊。 (C)为了保持兼容性,我会采取以下措施:

usage: http URL [ITEM...] 
       http METHOD URL [ITEM...]

在这种情况下,第二个子模式永远不会匹配( docopt 对网址和方法一无所知,这使得第一个模式成为第二个模式的超集),然后我会分解参数为:

positional_arguments = [args['URL']] + args['ITEM']

然后手动解析positional_arguments,具体取决于第一个参数是url,还是请求动词。

很抱歉 docopt 不能优雅地处理这种情况,我会更多地考虑这个用例。如果您有任何建议,请创建一个问题:https://github.com/docopt/docopt/issues

P.S。你是对的,REQUEST ITEM是错误的,非传统和混乱。它应该是REQUEST-ITEMREQUEST_ITEMITEM