Python 在命令列引數中解析布林值
當從任何命令列執行 Python 指令碼時,例如命令提示符、Git Bash、Linux 終端、MAC Shell 等,我們可以向它們傳遞引數或值。這些值稱為命令列引數。
這些引數通常是整數、浮點數、字串和表示為字串的布林值,這意味著它們必須在程式碼中進行型別轉換。
在本文中,我們將學習如何使用 Python 從命令列引數解析布林值。
使用 Python 中的 argparse
模組從命令列引數解析布林值
Python 有許多基本的內建模組,例如 math
、random
、json
、csv
等,旨在解決一般和重複的程式設計問題。一個這樣的包是 argparse
,它可以幫助程式設計師快速編寫使用者友好的命令列介面。使用此模組,可以定義程式正常工作所需的引數。
除了定義之外,argparse
模組還可以定義預設值、錯誤訊息、幫助文字,並對值執行常見操作,例如驗證、型別轉換、轉換等。我們可以將 argparse
模組用於我們的用例.
我們將實現一個需要一個字串值和兩個布林值才能正常工作的程式。這只是用於理解目的的示例。
請參考以下 Python 程式碼。
import argparse
def parse_boolean(value):
value = value.lower()
if value in ["true", "yes", "y", "1", "t"]:
return True
elif value in ["false", "no", "n", "0", "f"]:
return False
return False
def output(name, burger, cake):
if burger and cake:
return f"{name} is eating a burger and a cake."
elif burger:
return f"{name} is eating a burger."
elif cake:
return f"{name} is eating a cake."
return f"{name} is eating nothing."
parser = argparse.ArgumentParser(
description="A program that accepts one string and two boolean values."
)
parser.add_argument("name", help="Name of a person.")
parser.add_argument(
"--burger", type=parse_boolean, default=False, help="Flag for burger."
)
parser.add_argument("--cake", type=parse_boolean, default=False, help="Flag for cake.")
args = parser.parse_args()
print(output(args.name, args.burger, args.cake))
Python 程式碼說明
上面的 Python 程式碼首先建立了一個 ArgumentParser
類的物件。此類具有解析命令列引數的所有實用程式。以下是該類的類簽名。
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)
所有這些引數都是關鍵字引數,它們應該作為關鍵字引數傳遞給類。
接下來,使用該物件的 add_argument()
函式,我們向解析器新增引數。以下是此函式的一些主要引數。
name
- 名稱或選項字串列表。例如,world
,或--world
和-w
。action
- 在命令列引數中找到此引數時要執行的操作。nargs
- 應該考慮的命令列引數的數量。type
- 引數應轉換為的資料型別。const
-action
和nargs
所需的常量值。default
- 如果命令列引數中缺少引數,則應考慮的預設值。help
- 引數的幫助文字。
我們新增三個引數,即 name
、--burger
和 --cake
。這裡,name
是位置引數,--burger
和 --cake
是兩個可選引數。我們為每個引數定義了幫助文字,對於可選引數,我們還定義了預設值。
接下來,我們使用 parse_args()
方法將字串引數轉換為它們各自的物件或資料型別。此方法返回一個 Namespace
物件,其中包含所有引數作為指向其各自轉換值的鍵。我們可以按如下方式訪問這些型別轉換的值。
args.name
args.burger
args.cake
我們還定義了兩個函式,即 parse_boolean()
和 output()
。parse_boolean()
函式接受作為可選布林引數旁邊的命令列引數輸入的值。然後它解釋該值並返回相應的布林值。
請注意,這裡的函式將為任何亂碼值返回 False
。人們也可以引發一個異常
而不是返回一些預設值。你可以使用以下命令對其進行測試。
python main.py Vaibhav --burger Hello --cake World
輸出:
Vaibhav is eating nothing.
另一個函式是 output()
函式。該函式接受三個值(一個字串和兩個布林值)並返回一個合適的輸出字串。
測試
要測試程式,請從任何命令列執行以下命令。請注意,以下命令認為上述 Python 程式碼存在於名為 main.py
的檔案中。
python main.py Vaibhav --burger True --cake True
python main.py Vaibhav --burger T --cake 0
python main.py Vaibhav --burger False --cake False
python main.py Vaibhav --burger True --cake False
python main.py Vaibhav --burger False --cake True
python main.py Vaibhav --burger ABC --cake XYZ
python main.py Vaibhav
python main.py Vaibhav --burger True
python main.py Vaibhav --cake False
python main.py
輸出:
Vaibhav is eating a burger and a cake.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating a cake.
Vaibhav is eating nothing.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
usage: main.py [-h] [--burger BURGER] [--cake CAKE] name
main.py: error: the following arguments are required: name
正如我們所見,最後一個命令 python main.py
引發了錯誤。背後的原因很簡單; name
是一個位置和強制引數。