為編寫麵向行的命令解釋器提供簡單框架的類稱為 cmd 類。這些通常對於稍後將被包裝在更複雜的接口中的管理工具、原型和測試工具很有用。使用 cmd 模塊可以輕鬆創建命令行接口。
如今,圖形用戶接口的使用如此之多,以至於命令行解釋器似乎已經過時了。命令行接口有幾個優點:
- 命令行接口是可移植的並且可以在任何地方運行。
- CPU和內存資源比GUI接口便宜得多。
- 使用命令行打開文件比進入驅動程序並搜索菜單更容易。
- 創建麵向文本的文檔要快得多。
命令類
該模塊隻定義了一個類:Cmd 類。命令行解釋器創建sub-classing cmd.Cmd 類。 Cmd 實例或子類實例可以被視為麵向行的解釋器框架。
- 創建命令:在解釋器提示符下輸入的一行文本的第一部分是命令。 identchars 成員中包含的最長字符串是 Command。
非重音字母、數字和下劃線符號是默認的 identchars。該行的末尾是命令的參數。 - 參數:do_xxx 方法隻應采用一個額外參數,該參數對應於用戶在命令名稱後輸入的字符串部分。
- Errors:解釋器使用以下格式來表示錯誤:
*** :
- 返回值:在最常見的情況下:命令不應返回值。當您想要退出解釋器循環時,任何返回真值的命令都會停止解釋器,這是一個例外。
Example:
Python3
def add(self, d):
k = d.split()
if len(k)!= 2:
print "*** invalid number of arguments"
return
try:
k = [int(i) for i in k]
except ValueError:
print "*** arguments should be numbers"
return
print k[0]+k[1]
命令解析模塊
cmdparser 包包含兩個可用於編寫文本命令解析器的模塊。
該模塊特別使用內置的Python cmd 模塊。該軟件包由兩個模塊組成:
- cmdparser.cmdparser
- cmdparser.datetimeparse
安裝
我們可以從 PyPI 安裝 cmdparse 包。例如
pip install cmdparse
cmdparse 概述
Cmd 模塊允許從文本命令規範創建解析樹,如下所示
chips( spam | ham [eggs] | beans [eggs [...]] )
可以使用這些解析樹檢查特定的命令字符串。此外,它還允許列出部分命令字符串的有效完成。
例子:
Python3
from cmdparser import cmdparser
parse_tree = cmdparser.parse_spec("abc (def|ghi) <jkl> [mno]")
# Returns None to indicate
# successful parse
parse_tree.check_match(("abc", "def", "anything"))
# Returns an appropriate
# parsing error message
parse_tree.check_match(("abc", "ghi", "anything", "pqr"))
# Returns the list ["def", "ghi"]
parse_tree.get_completions(("abc", ))
輸出:
可以設置動態令牌,其中接受的字符串列表可以隨時間變化,或者在處理固定令牌字符串時可以接受任意字符串或字符串列表。檢查模塊的文檔字符串以了解可用類的具體信息,例如:
Python3
from cmdparser import cmdparser
class fruitToken(cmdparser.Token):
def get_values(self, context):
# Static list here, but could
# easily be dynamic
return ["raspberry", "orange", "mango",
"grapes", "apple", "banana"]
def my_ident_factory(token):
if token == "number":
return cmdparser.IntegerToken(token)
elif token == "fruit":
return fruitToken(token)
return None
parse_tree = cmdparser.parse_tree("take <number> <fruit> bags",
ident_factory = my_ident_factory)
# Returns None to indicate successful
# parse, and the "cmd_fields" dict will
# be initialised as:
# { "take": ["take"], "<number>": ["23"],
# "<fruit>": ["apple"], "bags": ["bags"] }
cmd_fields = {}
parse_tree.check_match(("take", "23",
"apple", "bags"),
fields = cmd_fields)
# Returns an appropriate
# parsing error message
parse_tree.check_match(("take", "all",
"raspberry", "bags"))
# Returns the list ["raspberry",
# "orange", "mango", ..., "banana"]
parse_tree.get_completions(("take", "5"))
輸出:
有四個類可用,它們是用戶派生令牌的合適基類:
- Token:當一組固定值合適時,這是有用的,其中列表可以是固定的或動態的。應重寫 get_values() 方法以將有效標記列表作為字符串返回。
- Anytoken:它與 Token 類似,但可以是任何字符串。可以通過 validate() 方法執行驗證,但 validate() 方法不允許製表符完成,因為隻有在解析整個命令後才會調用它。如果需要的話,還有一個convert()方法
- AnyTokenString:與 AnyToken 類似,但命令行上的所有剩餘項目都會被消耗。
- Subtree:它匹配整個命令子樹,並將結果存儲在字段字典中的指定標記上。命令規範字符串應傳遞給構造函數,類型類將重寫 convert() 方法並以某種方式解釋命令(盡管這是嚴格可選的)。
裝飾器可與從 cmd.Cmd 派生的命令處理程序一起使用,它允許從文檔字符串幫助文本中自動提取命令字符串,並允許將命令解析和完成添加到類的命令處理方法中。
實現do_XXX() 形式的各種方法來實現 cmd.Cmd 類。
Python3
from cmdparser import cmdparser
@cmdparser.CmdClassDecorator()
class CommandHandler(cmd.Cmd):
@cmdparser.CmdMethodDecorator():
def do_command(self, args, fields):
"""command ( add | delete ) <name>
The example explains the use of
command to demonstrate use of the cmd
decorators.
"""
# Method body - it will only be called
# if a command parses successfully according
# to the specification above.
日期時間解析概述
- Datetimeparse 模塊添加了特定的標記類型來解析人類可讀的日期和時間規範。指定絕對日期和相對日期這兩種類型,並根據需要將其轉換為其他實例。
一些例子是
1:35 on friday last week 11 feb 2019
- 當前定義的類有:
- DateSubtree:它包括文字日期 (2020-03-14)、與當天相關的星期幾(上周星期六)、說明性版本(2019 年 6 月 26 日)以及昨天、今天和明天以及解析日曆日期。返回值是datetime.date實例。
- TimeSubtree:12 或 24 小時格式的時間由 TimeSubtree 解析。返回值是time.localtime()返回的值。
- RelativeTimeSubtree:返回的值是 cmdparser.DateDelta 的實例,它是包含 datetime.timedelta 的包裝類。它解析指示與當前時間的時間偏移的短語,例如 3 天前和 2 小時前。
- DateTimeSubtree:datetime.datetime 實例是返回值。DateTimeSubtree 解析日期和時間的規範,接受 DateSubtree 和 TimeSubtree 短語的組合,或 RelativeTimeSubtree 短語;在後一種情況下,時間是相對於當前時間而言的。
- CLassCalenderPeriodSubtree:解析過去日曆周期的規範。返回的值是 datetime.date 實例的 2 元組,表示指定的日期範圍,其中第一個日期包含在內,第二個日期不包含在內。
- DateSubtree:它包括文字日期 (2020-03-14)、與當天相關的星期幾(上周星期六)、說明性版本(2019 年 6 月 26 日)以及昨天、今天和明天以及解析日曆日期。返回值是datetime.date實例。
相關用法
- Python Calendar itermonthdates()用法及代碼示例
- Python Calendar itermonthdays()用法及代碼示例
- Python Calendar itermonthdays2()用法及代碼示例
- Python Calendar itermonthdays3()用法及代碼示例
- Python Calendar itermonthdays4()用法及代碼示例
- Python Calendar iterweekdays()用法及代碼示例
- Python Calendar monthdatescalendar()用法及代碼示例
- Python Calendar monthdays2calendar()用法及代碼示例
- Python Calendar monthdayscalendar()用法及代碼示例
- Python Calendar yeardatescalendar()用法及代碼示例
- Python Calendar yeardays2calendar()用法及代碼示例
- Python Calendar yeardayscalendar()用法及代碼示例
- Python Condition acquire()用法及代碼示例
- Python Condition notify()用法及代碼示例
- Python Condition notify_all()用法及代碼示例
- Python Condition release()用法及代碼示例
- Python Condition wait()用法及代碼示例
- Python Collections.UserList用法及代碼示例
- Python Collections.UserDict用法及代碼示例
- Python Collections.UserString用法及代碼示例
- Python Celsius轉Fahrenheit用法及代碼示例
- Python CSV轉JSON用法及代碼示例
- Python CSV File轉PDF File用法及代碼示例
- Python Complex Number轉String用法及代碼示例
- Python Coordinate Dictionary轉Matrix用法及代碼示例
注:本文由純淨天空篩選整理自shivalibhadaniya大神的英文原創作品 Cmdparse module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。