Python 在命令列引數中解析布林值

Vaibhav Vaibhav 2022年5月17日
Python 在命令列引數中解析布林值

當從任何命令列執行 Python 指令碼時,例如命令提示符、Git Bash、Linux 終端、MAC Shell 等,我們可以向它們傳遞引數或值。這些值稱為命令列引數。

這些引數通常是整數、浮點數、字串和表示為字串的布林值,這意味著它們必須在程式碼中進行型別轉換。

在本文中,我們將學習如何使用 Python 從命令列引數解析布林值。

使用 Python 中的 argparse 模組從命令列引數解析布林值

Python 有許多基本的內建模組,例如 mathrandomjsoncsv 等,旨在解決一般和重複的程式設計問題。一個這樣的包是 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 - actionnargs 所需的常量值。
  • 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 是一個位置和強制引數。

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.