Qingchat 使用的命令行參數解釋器是 docopt ,用下來感覺非常棒,所以決定介紹一下這個庫。( 奉勸各位看官,真愛生命,遠離argparse。 )
介紹
docopt 本質上是在 Python 中引入了一種針對命令行參數的形式語言,在代碼的最開頭使用""" 文檔注釋的形式寫出符合要求的文檔,就會自動生成對應的parse,體驗非常贊。
用法
樣例
docopt的使用非常簡單,以Qingchat為例,你只需要在代碼最開頭加入:
"""Qingchat CLI
Usage:
qingchat config ip <ip>
qingchat config port <port>
qingchat config login
qingchat group list
qingchat group choose <group_name>...
qingchat group clean
qingchat group send -t <content>
qingchat group send -i <media>
qingchat group send -f <file> [<delaytime>]
Options:
-h --help Show this screen.
-v --version Show version.
"""
然后在執行代碼中加入:
arguments = docopt(__doc__, version='Qingchat 0.3.2')
就會在你的程序中導入一個 arguments 字典,這個字典中的內容形如:
{
'-f': False,
'-i': False,
'-t': False,
'<content>': None,
'<file>': None,
'<group_name>': [],
'<ip>': '127.0.0.1',
'<media>': None,
'<port>': None,
'choose': False,
'clean': False,
'config': True,
'group': False,
'ip': True,
'list': False,
'login': False,
'port': False,
'send': False
}
這樣應該就能很容易看出來,我們在文檔中寫的每一個短語,都被轉化為一個對應的類型。只要直接調用 arguments['xxx'] 就可以判斷或者使用對應的值,從而實現對應的功能。
詳解
前面我們舉了一個例子,下面我們來詳細介紹一下如何完成一個符合 docopt 要求的注釋文檔。
Usage
所有出現在 usage: (區分大小寫)和一個空行之間的文本都會被識別為一個命令組合, usage 后的第一個字母將會被識別為這個程序的名字,所有命令組合的每一個部分(空格分隔)都會成為字典中的一個key。
參數
形如 <argument> 或者 ARGUMENT 的文本將會被識別為參數。
在轉化后的字典中的取值為 True 或者 False 。
Usage: my_program <host> <port>
選項
形如 -o 或者 --option 的文本將會被識別為選項。
在轉化后的字典中的取值為 True 或者 False 。
Usage: my_program -f <file>
Tips:
- 短選項可以組合起來,比如
-abc等價於-a -b -c - 長選項需要的參數需要使用
=或者空格來分隔,--input=ARG等價於--input ARG - 短選項可以不需要空格,
-f FILE等價於-fFILE
命令
其他不滿足 --options 或者 <arguments> 的文本將會被識別為(子)命令。
在轉化后的字典中取值為 True 或者 False 。
可選項
形如 [optional elements] 的文本是可選項。
elements 包括上述的三種類型:參數,選項以及命令。
在相同或者不同的括號中都是一樣的:
Usage: my_program [command --option <argument>]
等價於
Usage: my_program [command] [--option] [<argument>]
必填項
形如 (required elements) 的文本是必填項。
上述三種元素默認都是必填項, () 符號用在一些比較特殊的情形下,比如:
Usage: my_program (--either-this <and-that> | <or-this>)
選擇項
形如 element|another 的文本是選擇項,你可以從中選擇一個值。
Usage: my_program go (--up | --down | --left | --right)
列表項
形如 element... 的文本是列表項,你可以輸入多個參數。
比如說:
Usage: my_program open <file>...
然后你可以通過 arguments['<file>'] 來訪問這個列表。
Option
Option 部分用於指定某些特殊情形,比如:
- 將某個短參數與長參數關聯起來,比如
-i <file>, --input <file> - 某個選項有一個參數
- 選項的默認值,比如
--coefficient=K The K coefficient [default: 2.95]
