python docopt模組詳解
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 }
下面我們來詳細介紹一下如何完成一個符合 docopt 要求的註釋文件:
Usage
所有出現在Usage:(區分大小寫)和一個空行之間的文字都會被識別為一個命令組合, Usage 後的第一個字母將會被識別為這個程式的名字,所有命令組合的每一個部分(空格分隔)都會成為字典中的一個key
引數
形如<argument> 或者 ARGUMENT的文字將會被識別為引數
在轉化後的字典中的取值為True 或者False.
Usage:my_program <host> <port>
選項
形如-o 或者 --option 的文字將會被識別為選項
在轉換後的字典中的取值為True或False
Usage:my_program -f <file>
Tips:
1. 短選項可以組合起來,比如 -abc 等價於 -a -b -c
2. 長選項需要的引數需要使用 = 或者空格來分隔, --input=ARG 等價於 --input ARG
3. 短選項可以不需要空格, -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 部分用於指定某些特殊情形,例如:
1. 將某個短引數與長引數關聯起來,比如 -i <file>, --input <file>
2. 某個選項有一個引數
3. 選項的預設值,比如 --coefficient=K The K coefficient [default: 2.95]