使用 argparse 的 Python 鍵值對程式


在開發 Python 應用程式時,通常需要建立接受鍵值對作為輸入引數的程式。鍵值對提供了一種靈活的方式來將資料傳遞給程式,從而允許自定義和引數化。幸運的是,Python 提供了一個名為argparse的強大模組,它簡化了構建命令列介面的過程,包括處理鍵值對。

在 Python 中構建命令列介面時,argparse 模組是一個非常有用的工具。它簡化了處理命令列引數的過程,並提供了一種簡潔直觀的方式來定義和解析它們。

argparse 模組提供了廣泛的功能,包括處理不同型別的引數、提供使用說明、處理預設值等等。

構建 Python 程式

讓我們首先建立一個新的 Python 檔案 key_value_parser.py,並匯入必要的模組 -

import argparse

接下來,我們需要定義程式將接受的命令列引數。在本例中,我們希望允許鍵值對。我們可以透過指定兩個單獨的引數來實現:一個用於鍵,另一個用於值。將以下程式碼新增到 key_value_parser.py 檔案中 -

def main():
   parser = argparse.ArgumentParser(description='Key-Value Pair Parser')
   parser.add_argument('-k', '--key', type=str, help='Key')
   parser.add_argument('-v', '--value', type=str, help='Value')
   args = parser.parse_args()
    
   if args.key and args.value:
      print(f'Key: {args.key}')
      print(f'Value: {args.value}')
   else:
      parser.print_help()

在上面的程式碼中,我們定義了一個名為 main() 的函式來封裝我們的程式邏輯。這是一種常見的做法,它允許我們重用或將此程式碼匯入到其他模組中(如果需要)。

我們建立 argparse.ArgumentParser 類的例項並將其分配給變數 parser。我們將字串傳遞給 description 引數,該引數提供程式功能的簡要說明。

執行程式

要測試我們的程式,我們可以透過傳遞鍵值對作為引數從命令列執行它。以下是一個示例 -

$ python key_value_parser.py --key name --value John
Key: name
Value: John

在上面的示例中,我們傳遞了 --key name 來指定鍵,並傳遞了 --value John 來指定值。然後,程式列印提供的鍵和值。

如果我們忘記提供鍵或值,程式將顯示幫助訊息 -

$ python key_value_parser.py --key name
usage: key_value_parser.py [-h] [-k KEY] [-v VALUE]
key_value_parser.py: error: argument -v/--value is required

處理邊緣情況和錯誤處理

在本節中,讓我們探討其他場景並增強程式的健壯性。我們將解決以下情況 -

處理鍵或值丟失的情況

目前,如果鍵或值丟失,我們的程式會顯示幫助訊息。讓我們增強錯誤處理並提供更具描述性的錯誤訊息來指導使用者正確使用。我們可以修改 main() 函式如下 -

def main():
   parser = argparse.ArgumentParser(description='Key-Value Pair Parser')
   parser.add_argument('-k', '--key', type=str, help='Key', required=True)
   parser.add_argument('-v', '--value', type=str, help='Value', required=True)
   args = parser.parse_args()
    
   print(f'Key: {args.key}')
   print(f'Value: {args.value}')

透過將 required 引數設定為 True(對於鍵和值引數),我們表明它們是必需的。如果使用者未能提供鍵或值,argparse 將自動顯示錯誤訊息和使用幫助。

驗證鍵或值的格式

根據程式的要求,您可能希望驗證鍵或值的格式。例如,如果鍵始終應為字母數字字串,我們可以新增驗證檢查。類似地,如果值應為有效的電子郵件地址,我們可以相應地實現驗證。讓我們演示字母數字鍵的驗證 -

import re

def main():
   parser = argparse.ArgumentParser(description='Key-Value Pair Parser')
   parser.add_argument('-k', '--key', type=str, help='Key', required=True)
   parser.add_argument('-v', '--value', type=str, help='Value', required=True)
   args = parser.parse_args()
    
   key_pattern = re.compile(r'^[a-zA-Z0-9]+$')
   if not key_pattern.match(args.key):
      print('Error: Invalid key format. The key must be alphanumeric.')
      return
    
   print(f'Key: {args.key}')
   print(f'Value: {args.value}')

在上面的程式碼中,我們匯入 re 模組來使用正則表示式。我們定義了一個正則表示式模式 key_pattern,它使用 ^[a-zA-Z0-9]+$ 模式匹配字母數字字串。如果提供的鍵與該模式不匹配,我們將顯示錯誤訊息並退出程式。

處理重複鍵

如果您的程式需要處理多個鍵值對,您可能會遇到提供重複鍵的情況。考慮您希望如何處理此類情況。您是否希望用新值覆蓋現有值,或者將其視為錯誤?

您可以維護一個字典來儲存鍵值對,並在更新字典之前檢查重複項。以下是一個示例實現 -

def main():
   parser = argparse.ArgumentParser(description='Key-Value Pair Parser')
   parser.add_argument('-k', '--key', type=str, help='Key', required=True)
   parser.add_argument('-v', '--value', type=str, help='Value', required=True)
   args = parser.parse_args()
    
   # Store key-value pairs in a dictionary
   key_value_dict = {}

   if args.key in key_value_dict:
      print(f'Warning: Duplicate key "{args.key}" found. Overwriting the previous value.')
   key_value_dict[args.key] = args.value

   # Print all key-value pairs
   print('Key-Value Pairs:')
   for key, value in key_value_dict.items():
      print(f'Key: {key}, Value: {value}')

在上面的程式碼中,我們建立了一個字典 key_value_dict 來儲存鍵值對。在新增新的鍵值對之前,我們檢查該鍵是否已存在於字典中。如果找到重複鍵,我們將顯示警告訊息並繼續用新值覆蓋先前值。

錯誤處理和異常捕獲

為了確保我們的程式優雅地處理潛在的錯誤和異常,務必實現適當的錯誤處理。我們可以使用 try-except 塊來捕獲和處理程式執行期間發生的任何意外問題。以下是一個示例 -

def main():
   try:
      parser = argparse.ArgumentParser(description='Key-Value Pair Parser')
      parser.add_argument('-k', '--key', type=str, help='Key', required=True)
      parser.add_argument('-v', '--value', type=str, help='Value', required=True)
      args = parser.parse_args()
        
      # Rest of the program logic...

   except Exception as e:
      print(f'An error occurred: {str(e)}')

if __name__ == '__main__':
   main()

在上面的程式碼中,我們將程式邏輯包裝在 try 塊中,幷包含一個 except 塊來捕獲可能發生的任何異常。如果在執行期間引發異常,它將被捕獲,並且將顯示相應的錯誤訊息。

結論

在 Python 程式中使用 argparse 提供了一種有效且高效的方式來處理來自命令列的鍵值對輸入。透過利用 argparse 模組,開發人員可以輕鬆地定義命令列引數及其關聯的值,從而實現更友好的使用者介面和更規範的介面。

更新於: 2023-08-14

839 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告