有時,我們必須使用命令提示符終端來編寫命令,這個終端解釋為各種目的編寫的內聯命令,稱為命令解釋器。我們可以編寫和構建一個框架,用來編寫面向行的命令解釋器,為了完成這個任務,有時我們必須使用類。一個為命令解釋器提供框架以便我們可以編寫面向行的命令的類被稱為 cmd 類。現在,我們很多人想知道 cmd 類的用途是什麼,它對我們有什麼幫助。cmd 類對於創建原型、稍後將包裝的測試工具以及以更複雜的方式呈現的管理工具非常有用。因此,要執行所有這些任務並創建這些工具,我們必須使用命令行界面,這可以使用 cmd 類輕鬆構建。
命令行解釋器的使用已經變得非常罕見,因為現在大多數應用中的圖形用戶界面已經增加。因此,用戶更傾向於只使用這些應用,而不是使用簡單的面向行的命令解釋器,但是使用命令行界面有其自身的優勢。
以下是使用命令行界面或解釋器的幾個優點:
- 這些命令行解釋器沒有任何基於圖形用戶界面的界面;這就是為什麼遠離更便宜的計算機的 CPU 和內存資源也是可用的。
- 用命令行解釋器創建一個面向文本的文檔非常容易,而且我們可以非常快速地創建它。
- 由於命令行解釋器是可移植的,因此,我們可以在任何設備的任何地方運行它們。
- 在命令行解釋器中打開一個文件非常容易,而且這種方法比進入驅動程序和在菜單中搜索文件要快得多。
這些是命令行解釋器的一些主要優點,這就是為什麼即使在今天,大多數用戶也更喜歡它們,而不是許多基於圖形用戶界面的應用,這些應用的界面更有吸引力。看到這些優點後,我們可以理解並得出結論,用 cmd 類構建命令行解釋器是多麼有用。它不僅對我們的職業生活和職業任務有幫助,而且對我們的個人項目也有幫助。聽到 cmd 類也出現在 Python 包中,我們中的許多人都會感到驚訝,因此可以使用 Python 程序為命令行界面創建一個框架。我們將學習 Python 中的 CmdParser 模塊,在這個模塊中我們將看到 cmd 類的使用,我們將使用這個模塊為命令行解釋器構建一個框架。
Python 中的 CmdParser 模塊
Cmdparser Module 是一個 Python 包,其中包含兩個子模塊,這對我們編寫文本命令解析器和創建命令行界面框架非常有用。CmdParser 模塊中也使用了這個的 cmd 類&函數,我們將在程序中使用這些函數構建一個解析樹來執行名稱匹配操作。Python 中的 CmdParser 模塊使用 Python 的內置 cmd 模塊,並調用它來創建命令行界面的框架。
Python 的 CmdParser 模塊包含以下兩個子模塊或 Python 包:
- 日期時間屁股
- cmdparser
在本教程中,我們將學習 Cmdparser 包的兩個子模塊的實現和工作方式,並在 Python 程序中使用它們來創建一個簡單的解析樹。
CmdParser 模塊:安裝
如果我們想在 Python 程序中使用 Cmdparser Module 的函數和子模塊,我們應該確保這個模塊存在於我們的系統中,因為它不是 Python 的內置模塊。因此,如果 CmdParser 模塊還沒有出現在我們的系統中,我們必須安裝它,以進一步推進其子模塊的實現部分。我們可以通過各種安裝過程來安裝 Cmdparser Module,但是在這裡我們將使用 pip 安裝程序來執行此任務,因為這是最簡單易行的方法。
在終端 Shell 中寫下以下命令,通過 pip 安裝程序在我們的系統中安裝 CmdParser 模塊:
pip install cmdparser
寫完上面給出的命令後,我們必須按回車鍵並等待一段時間,因為成功安裝這個模塊需要一段時間。
正如我們所看到的,CmdParser 模塊現在已經成功安裝在我們的系統中,現在,我們可以通過將它導入程序來使用它及其子模塊。我們將首先查看 cmdparser 包的 Cmdparser 子模塊的概述和實現,然後我們將瀏覽 datetimeparser 子模塊的概述。
CmdParser 模塊:cmdparser 子模塊概述:
Python 的 cmdparser 包中的 Cmdparser 子模塊允許我們在文本命令規範的幫助下創建解析樹結構,如下所示:
fries( scam | ham [eggs] | peas [omelette [...]] )
我們可以使用解析樹結構來檢查這個特定的命令字符串。cmdparser 子模塊還允許我們驗證要為解析樹列出的部分命令字符串的完成情況。讓我們通過使用上面列出的文本命令規範從 Python 程序中創建一個解析樹來理解這個概念。
示例:看看下面的 Python 程序,我們從 cmdparser 子模塊創建了一個解析樹,然後將令牌與解析樹進行匹配:
# Import cmdparser package from cmdparser module
from cmdparser import cmdparser
# Creating a sample parse tree
parseTree = cmdparser.parse_spec("abcd (efgh|ijkl) [qrst]")
# Matching tokens from parse tree
parseTree.check_match(("abcd", "efgh", "something"))
parseTree.check_match(("abcd", "efgh", "anything", "uvwx")) # Will throw an error
# Completing parse tree in the output
parseTree.get_completions(("abcd", ))
輸出:
"command invalid somewhere in: 'uvwx'"
{'efgh', 'ijkl'}
說明:
我們首先從 cmdparser 包中導入 cmdparser 子模塊,在程序中創建一個帶有標記的解析樹。之後,我們使用 cmdparser 包中的 parse_spec()函數在 parse tree 變量中創建了一個示例解析樹。在解析樹中,我們只定義了靜態標記,並在以後用於匹配。之後,我們使用 cmdparser 包的 parsematch()來匹配我們定義的解析樹中的標記。在第二個匹配中,解析樹將拋出一個錯誤,因為「uvwx」不是包中定義的靜態標記。最後,我們使用 parse completions()函數來完成解析樹中的其餘標記。該函數將在輸出中打印解析樹的其餘靜態標記。
現在,正如我們在輸出中所看到的,解析中剩餘的靜態標記被打印出來,在此之前,還打印了一個「uvwx」標記的錯誤。
我們在解析中使用了靜態標記,這是我們在上面給出的示例中創建的,但是我們也可以使用 CmdParser 模塊在動態標記的幫助下創建解析樹。當我們創建一個包含動態標記的解析樹時,我們可以在接受字符串列表的地方設置動態標記,並且動態標記中的字符串列表會隨着時間而變化。我們還可以使用動態令牌,在處理固定令牌字符串時,可以接受任意字符串或字符串列表。如果我們想查看 CmdParser 模塊中所有可用於設置動態令牌的類的規範,我們可以檢查該模塊的文檔字符串。在這裡,我們將通過使用 CmdParser 模塊類創建一個帶有動態標記的解析樹來理解這一點。看看下面的例子,我們使用來自 CmdParser 模塊的動態標記創建了一個解析樹。
示例 2: 看看下面的 Python 程序,其中我們創建了一個帶有動態標記的解析樹,以接受字符串的動態列表:
# Import cmdparser from Cmdparser module
from cmdparser import cmdparser
# Class having fruit names as token
class tokenOfFruit(Cmdparser.Token):
def get_values(self, context):
return ["watermelon", "melon", "orange", "grapes", "lichi", "mango", "apple", "banana", "strawberry", "guava", "greenapple"] # Tokens of class with fruit name values
# Default function for identification
def myIdentfictionFactory(token):
if token == "number":
return Cmdparser.IntegerToken(token) # If token is a number
elif token == "fruit":
return tokenOfFruit(token) # If token is a fruit name
return None
# Creating a parse tree with fruit and number token in it
parseTree = Cmdparser.parse_spec("keep <fruit>packet", ident_factory = myIdentfictionFactory)
cmdFields = {}
# Matching with the parse tree
parseTree.check_match(("keep", "26", "mango", "packet"), fields = cmdFields)
parseTree.check_match(("keep", "all", "orange", "packet"))
# Getting completions from the parse tree
parseTree.get_completions(("keep", "24",))</fruit>
輸出:
"'all' is not a valid "
{'apple',
'banana',
'grapes',
'greenapple',
'guava',
'lichi',
'mango',
'melon',
'orange',
'strawberry',
'watermelon'}
說明:
從 Cmdparser Module 導入 cmdparser 子模塊包後,我們創建了一個類,其中水果名稱作為程序中解析樹的標記。我們在『token offurits』類中定義的水果名稱將作為解析樹的靜態標記,為了從該類中檢索水果名稱的值,我們在該類中定義了一個默認函數。然後,我們定義了另一個函數(myIdentificationFactory),它將在解析樹中接受動態標記,並將接受數值(數字)作為匹配值。為了設置帶有數值的動態標記,我們使用了 Cmdparser 包中的 IntegerToken()函數,因此它將使這成為一個動態標記,它將接受任何整數值作為解析樹中的匹配值。之後,我們使用 parse_spec()函數創建解析樹,將數字和水果作為動態標記,將「keep」和「packet」作為靜態標記。然後,我們使用 checkmatch()函數,並在其中給出標記值,以便從解析樹中執行匹配操作。我們可以在輸出中看到,當我們沒有提供數字時,它會拋出一個匹配錯誤。最後,當我們對解析樹使用 get completions()函數時,所有用作標記的水果值都會打印在輸出中。
cmdparser 子模塊中的類:
以下是 cmdparser 子包中可用的四個類,它們適合作為創建用戶派生令牌(靜態和動態)的基類:
- Token: Token 是來自 cmdparser 子包的基類,當固定值集合中的一個適合我們正在創建的解析樹時,它非常有用。在解析樹中,字符串值列表可以是靜態的,也可以是動態的,這個類可以用來創建和接受標記。如果我們想從結果的解析樹中返回一個有效標記列表作為字符串列表,我們必須重寫 get_values()方法。
- AnyToken: 這個基類類似於子包的 Token 類,但是在使用 AnyToken 基類時,任何字符串都應該出現在結果中。如果我們想要執行令牌的驗證,我們可以通過子模塊中可用的 validate()方法來完成。但是,在使用 validate()方法之前,我們應該注意 validate()方法不允許製表符結束,因為它只在整個命令被解析的過程中被調用。AnyToken 基類在調用字符串列表(靜態和動態)時也需要 convert()方法。
- AnyTokenString: 就兩個基類執行的功能而言,AnyTokenString 基類與 AnyToken 類非常相似。但是,在 AnyTokenString 類中,我們在命令行上定義的值的所有剩餘項都在解析過程中被使用。
- Subtree:cmd parser 子包中的子樹基類匹配我們創建的解析樹中的整個命令,並將匹配過程的結果與字典字段中指定的令牌進行比較。使用子樹類時,我們必須將命令規範字符串傳遞給類的構造器,然後類型類將重寫 convert()方法來解釋命令。
CmdParser 模塊:datetimeparser 子模塊概述:
Cmdparser 包中的 Datetimeparser 子模塊在創建解析樹時添加了一些特定的標記類型,這將有助於解析與日期和時間格式相關的人類可讀規範。在 datetimeparser 子模塊中,指定了絕對和相對日期類型,並且這些類型也可以在需要和適當的時候轉換為其他實例。
以下是 datetimeparser 子模塊中日期類型的示例:
- 2020 年 11 月 2 日
- 上周周四 01: 28 等。
日期計時器子模塊中的類:
以下是 CmdParser 模塊的 datetimeparser 子包中的五個可用類,適合作為創建用戶派生令牌(靜態和動態)的基類:
- TimeSubtree:datetime arser 子模塊的 TimeSubtree 類用於解析解析樹中以 12 或 24 小時格式給出的一天中的時間。解析給定時間後的返回值在 time.localtime()函數的幫助下返回。
- datetime subtree:來自 datetimeparser 子模塊的 datetime subtree 類的行為類似於 TimeSubtree 類。DateSubtree 類包括不同日期格式的文本,即一周中與當天(上周星期一)相關的天數、文本日期(01-11-2021)、描述性日期版本(01-11-2021)以及今天、昨天和明天以及解析日曆日期。在 DateSubtree 類的情況下,返回值是分析樹中的 datetime.date 實例。
- DateTimeSubtree: 在閱讀了 datetimeparser 子模塊的前兩個基類的描述後,我們可以通過名字得到 DateTimeSubtree 類的基本思路。DateTimeSubtree 類從解析樹中給定的日期和時間解析規範。DateTimeSubtree 接受 TimeSubtree 和 DateSubtree 短語的組合或者 RelativeTimeSubtree 類的一個短語(我們將在接下來閱讀這個類)來解析日期和時間的規範。如果短語來自 RelativeTimeSubtree 類,則根據給定的時間以相對格式計算時間。DateTimeSubtree 類的返回值是 datetime.datetime 實例值。
- RelativeTimeSubtree: 來自 datetimesubtree 子模塊的 RelativeTimeSubtree 基類從包裝類返回作為其返回值。RelativeTimeSubtree 類用於解析格式中給出的短語,該格式指示相對於當前時間的時間偏移,例如兩天前、三小時前等。RelativeTimeSubtree 類的返回值是 cmdparser 的一個實例。datetime delta 類(來自 datetimeparser 子模塊的包裝類)包含一個 datetime.timedelta 實例。
- class calendarperiodsubtree:class calendarperiodsubtree 是 datetimeparser 子模塊的最後一個基類,它解析過去給出的日曆周期的規範。在此類的情況下,返回值是 datetime.date 的 2 元組實例,它以返回值格式表示以下內容:從日曆中指定的日期範圍,其中範圍中的第一個日期是包含的,範圍中的第二個日期是排除的,等等。
結論
在本教程中,我們閱讀了關於 CmdParser 模塊的內容,並了解了如何使用該模塊的包來創建 cmdparser 的接口。我們在 Python 中了解了 cmdparser 包的 Cmdparser 和 datetimeparser 子模塊,以及它們如何有助於為解析樹創建標記。最後,我們查看了 Cmdparser 包的兩個子模塊的基類,並了解了這些類如何有助於解析為解析樹的標記給出的規範。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/283006.html