我正在尝试使用docopt实现HTTPie的CLI,但由于某种原因,我无法将METHOD作为第一个参数。我删除了大多数选项以隔离此问题。
此外,HTTPie的作者获取REQUEST ITEM的方式似乎与docopt文档有关,因此想知道实现该文章的最佳替代方法是什么。
HTTPie的完整文档:https://github.com/jkbr/httpie
我的docopt示例:https://gist.github.com/dasickis/4711926
答案 0 :(得分:2)
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。如果有很多命令,则使用可能会变成一条长行。 / 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-ITEM
或REQUEST_ITEM
或ITEM
。