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.