2013-02-05 40 views

回答

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.如果有很多命令,則使用可能會變成一長串。

如果你不關心與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

+0

FWIW,'REQUEST ITEM'已被更改爲'REQUEST_ITEM'。 –