”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握 Python 的 argparse:初学者综合指南

掌握 Python 的 argparse:初学者综合指南

发布于2024-09-16
浏览:617

Mastering Python’s argparse: A Comprehensive Guide for Beginners

介绍

Python 的 argparse 模块是用于构建用户友好的命令行界面的强大工具。无论您是在开发简单的脚本还是复杂的应用程序,了解如何有效地使用 argparse 都可以显着提高程序的可用性。在这篇文章中,我将引导您了解掌握 argparse 所需了解的所有内容 - 从基本参数解析到高级功能和最佳实践。


什么是argparse?

argparse 模块提供了一种简单的方法来处理传递给 Python 脚本的命令行参数。它自动生成帮助消息,处理类型检查,并可以处理可选参数和位置参数。

为什么使用argparse?

  • 自动帮助信息:用户可以通过使用--help选项轻松了解如何运行您的程序。
  • 类型检查:您可以确保输入有效(例如,您期望的整数)。
  • 可读的命令行界面:使您的脚本更加专业和用户友好。

让我们从基础开始!


设置 argparse

要开始使用 argparse,您首先需要导入模块并创建一个 ArgumentParser 对象:

import argparse

parser = argparse.ArgumentParser(description="Demo script for argparse.")

此处的描述参数是可选的,有助于解释脚本的用途。当用户运行 --help 命令时它会显示。

位置参数

位置参数是 argparse 中最基本的参数类型。这些是必需的,并且必须以正确的顺序出现在命令中。

parser.add_argument("name", help="Your name")
args = parser.parse_args()
print(f"Hello, {args.name}!")

运行脚本:

$ python script.py Alice
Hello, Alice!

如果不提供 name 参数,argparse 将抛出错误:

$ python script.py
usage: script.py [-h] name
script.py: error: the following arguments are required: name

可选参数

可选参数,顾名思义,不是强制性的。这些通常以一两个破折号(- 或 --)开头,以将它们与位置参数区分开来。

parser.add_argument("-g", "--greeting", help="Custom greeting message", default="Hello")
args = parser.parse_args()
print(f"{args.greeting}, {args.name}!")

运行脚本:

$ python script.py Alice --greeting Hi
Hi, Alice!

默认参数确保在用户未提供选项时使用默认值:

$ python script.py Alice
Hello, Alice!

参数类型

默认情况下,所有参数都被视为字符串。但您可以指定您期望的参数类型。例如,如果您需要一个整数:

parser.add_argument("age", type=int, help="Your age")
args = parser.parse_args()
print(f"{args.name} is {args.age} years old.")

运行脚本:

$ python script.py Alice 25
Alice is 25 years old.

如果您提供了无效类型(例如,需要整数的字符串),argparse 将自动显示错误:

$ python script.py Alice twenty-five
usage: script.py [-h] name age
script.py: error: argument age: invalid int value: 'twenty-five'

标志参数(布尔选项)

标志参数对于启用或禁用某些功能很有用。它们不接受任何值,而是充当开关。使用action="store_true"选项创建一个标志。

parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose mode")
args = parser.parse_args()

if args.verbose:
    print("Verbose mode is on.")

运行脚本:

$ python script.py Alice -v
Verbose mode is on.

如果不提供标志,则使用默认值 False:

$ python script.py Alice

短选项名称与长选项名称

argparse 允许您为同一参数定义短选项名称和长选项名称。例如:

parser.add_argument("-g", "--greeting", help="Custom greeting message")

您可以使用短版本 (-g) 或长版本 (--greeting):

$ python script.py Alice -g Hi
Hi, Alice!
$ python script.py Alice --greeting Hi
Hi, Alice!

默认值

在某些情况下,您可能需要为可选参数定义默认值。这可以确保即使缺少参数,您的程序也能正确运行。

parser.add_argument("-g", "--greeting", default="Hello", help="Greeting message")
args = parser.parse_args()
print(f"{args.greeting}, {args.name}!")

处理多个值

您还可以使用 nargs 指定接受多个值的参数。例如,要接受多个文件名:

parser.add_argument("files", nargs=" ", help="List of file names")
args = parser.parse_args()
print(f"Files to process: {args.files}")

运行脚本:

$ python script.py file1.txt file2.txt file3.txt
Files to process: ['file1.txt', 'file2.txt', 'file3.txt']

限制选择

您可以使用选项选项限制参数的可能值:

parser.add_argument("--format", choices=["json", "xml"], help="Output format")
args = parser.parse_args()
print(f"Output format: {args.format}")

运行脚本:

$ python script.py Alice --format json
Output format: json

如果用户提供了无效的选择,argparse 将抛出错误:

$ python script.py Alice --format csv
usage: script.py [-h] [--format {json,xml}] name
script.py: error: argument --format: invalid choice: 'csv' (choose from 'json', 'xml')

组合位置参数和可选参数

您可以在同一脚本中混合和匹配位置参数和可选参数。

parser.add_argument("name", help="Your name")
parser.add_argument("--greeting", help="Custom greeting", default="Hello")
parser.add_argument("--verbose", action="store_true", help="Enable verbose output")

args = parser.parse_args()

if args.verbose:
    print(f"Running in verbose mode...")

print(f"{args.greeting}, {args.name}!")

生成帮助消息

argparse 的最大优势之一是其内置的帮助消息生成器。当用户使用 -h 或 --help 标志运行脚本时,argparse 将自动显示参数及其描述。

$ python script.py -h
usage: script.py [-h] [--greeting GREETING] [--verbose] name

Demo script for argparse.

positional arguments:
  name             Your name

optional arguments:
  -h, --help       show this help message and exit
  --greeting GREETING
                   Custom greeting
  --verbose        Enable verbose output

子解析器:处理多个命令

如果您的脚本有多个子命令(例如 git commit、git push),您可以使用子解析器来处理它们。

parser = argparse.ArgumentParser(description="Git-like command-line tool")
subparsers = parser.add_subparsers(dest="command")

# Add "commit" subcommand
commit_parser = subparsers.add_parser("commit", help="Record changes to the repository")
commit_parser.add_argument("-m", "--message", help="Commit message", required=True)

# Add "push" subcommand
push_parser = subparsers.add_parser("push", help="Update remote refs")

args = parser.parse_args()

if args.command == "commit":
    print(f"Committing changes with message: {args.message}")
elif args.command == "push":
    print("Pushing changes to remote repository.")

最佳实践

以下是使用 argparse 时需要考虑的一些最佳实践:

  1. 始终提供帮助消息:使用 add_argument 中的帮助参数来描述每个选项的作用。
  2. 使用合理的默认值:在适当的情况下提供默认值,以确保顺利执行,而不需要所有参数。
  3. 验证输入:使用选择和类型来确保用户提供有效的输入。
  4. 保持简单:除非绝对必要,否则尽量不要使用太多参数使脚本过载。
  5. 构建命令:对于复杂的工具,使用子解析器逻辑地分隔不同的命令。

结论

argparse 模块对于编写专业的、用户友好的 Python 脚本至关重要。通过利用其位置和可选参数、类型检查和子解析器等功能,您可以创建直观且强大的命令行界面。

下次构建 Python 脚本时,请考虑使用 argparse 使其更加灵活和易于访问。快乐编码!


如果您有疑问或建议,请随时与我联系。与我联系:

  • 领英
  • GitHub
版本声明 本文转载于:https://dev.to/usooldatascience/mastering-pythons-argparse-a-comprehensive-guide-for-beginners-48fn?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 掌握 TypeScript:了解扩展的力量
    掌握 TypeScript:了解扩展的力量
    TypeScript 中的 extends 关键字就像一把瑞士军刀。它用于多种上下文,包括继承、泛型和条件类型。了解如何有效地使用扩展可以生成更健壮、可重用和类型安全的代码。 使用扩展进行继承 extends 的主要用途之一是继承,允许您创建基于现有接口或类的新接口或类。 inter...
    编程 发布于2024-11-06
  • 如何将具有组计数的列添加到 Pandas 中的分组数据框?
    如何将具有组计数的列添加到 Pandas 中的分组数据框?
    如何在Pandas中向分组数据框中添加列在数据分析中,经常需要对数据进行分组并进行计算每组。 Pandas 通过其 groupby 函数提供了一种便捷的方法来做到这一点。一个常见的任务是计算每个组中某一列的值,并将包含这些计数的列添加到数据帧中。考虑数据帧 df:df = pd.DataFrame(...
    编程 发布于2024-11-06
  • 破解编码面试的热门必备书籍(从初级到高级排名)
    破解编码面试的热门必备书籍(从初级到高级排名)
    准备编码面试可能是一个充满挑战的旅程,但拥有正确的资源可以让一切变得不同。无论您是从算法开始的初学者、专注于系统设计的中级开发人员,还是完善编码实践的高级工程师,这份按难度排名的前 10 本书列表都将为您提供成功所需的知识和技能。你的软件工程面试。这些书籍涵盖了从基本算法到系统设计和简洁编码原则的所...
    编程 发布于2024-11-06
  • Java 字符串实习初学者指南
    Java 字符串实习初学者指南
    Java String Interning 引入了通过在共享池中存储唯一字符串来优化内存的概念,减少重复对象。它解释了 Java 如何自动实习字符串文字以及开发人员如何使用 intern() 方法手动将字符串添加到池中。 通过掌握字符串驻留,您可以提高 Java 应用程序的性能和内存效率。要深入...
    编程 发布于2024-11-06
  • 如何在 GUI 应用程序中的不同页面之间共享变量数据?
    如何在 GUI 应用程序中的不同页面之间共享变量数据?
    如何从类中获取变量数据在 GUI 编程环境中,单个应用程序窗口中包含多个页面是很常见的。每个页面可能包含各种小部件,例如输入字段、按钮或标签。当与这些小部件交互时,用户提供输入或做出需要在不同页面之间共享的选择。这就提出了如何从一个类访问另一个类的变量数据的问题,特别是当这些类代表不同的页面时。利用...
    编程 发布于2024-11-06
  • React 中的动态路由
    React 中的动态路由
    React 中的动态路由允许您基于动态数据或参数创建路由,从而在应用程序中实现更灵活、更强大的导航。这对于需要根据用户输入或其他动态因素呈现不同组件的应用程序特别有用。 使用 React Router 设置动态路由 您通常会使用react-router-dom库在React中实现动态路由。这是分步指...
    编程 发布于2024-11-06
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-06
  • WPF中延迟操作时如何避免UI冻结?
    WPF中延迟操作时如何避免UI冻结?
    WPF 中的延迟操作WPF 中的延迟操作对于增强用户体验和确保平滑过渡至关重要。一种常见的情况是在导航到新窗口之前添加延迟。为了实现此目的,经常使用 Thread.Sleep,如提供的代码片段中所示。但是,在延迟过程中,使用 Thread.Sleep 阻塞 UI 线程会导致 UI 无响应。这表现为在...
    编程 发布于2024-11-06
  • 利用 Java 进行实时数据流和处理
    利用 Java 进行实时数据流和处理
    In today's data-driven world, the ability to process and analyze data in real-time is crucial for businesses to make informed decisions swiftly. Java...
    编程 发布于2024-11-06
  • 如何修复损坏的 InnoDB 表?
    如何修复损坏的 InnoDB 表?
    从 InnoDB 表损坏中恢复灾难性事件可能会导致数据库表严重损坏,特别是 InnoDB 表。遇到这种情况时,了解可用的修复选项就变得至关重要。InnoDB Table Corruption Symptoms查询中描述的症状,包括事务日志中的时间戳错误InnoDB 表的修复策略虽然已经有修复 MyI...
    编程 发布于2024-11-06
  • JavaScript 数组和对象中是否正式允许使用尾随逗号?
    JavaScript 数组和对象中是否正式允许使用尾随逗号?
    数组和对象中的尾随逗号:标准还是容忍?数组和对象中尾随逗号的存在引发了一些关于它们的争论JavaScript 的标准化。这个问题源于在不同浏览器中观察到的不一致行为,特别是旧版本的 Internet Explorer。规范状态根据 ECMAScript 5 规范(第 11.1.5 节) ),对象字面...
    编程 发布于2024-11-06
  • 最佳引导模板生成器
    最佳引导模板生成器
    在当今快速发展的数字环境中,速度和效率是关键,网页设计师和开发人员越来越依赖 Bootstrap 构建器来简化他们的工作流程。这些工具可以快速创建响应灵敏、具有视觉吸引力的网站,使团队能够比以往更快地将他们的想法变为现实。 Bootstrap 构建器真正改变了网站的构建方式,使该过程更加易于访问和高...
    编程 发布于2024-11-06
  • 简化 NestJS 中的文件上传:无需磁盘存储即可高效内存中解析 CSV 和 XLSX
    简化 NestJS 中的文件上传:无需磁盘存储即可高效内存中解析 CSV 和 XLSX
    Effortless File Parsing in NestJS: Manage CSV and XLSX Uploads in Memory for Speed, Security, and Scalability Introduction Handling file uploa...
    编程 发布于2024-11-06
  • 使用 SubDomainRadar.io 和 Python 轻松发现隐藏子域
    使用 SubDomainRadar.io 和 Python 轻松发现隐藏子域
    作为网络安全专业人员、漏洞赏金猎人或渗透测试人员,发现隐藏的子域对于识别至关重要域中的潜在漏洞。子域通常托管可能容易受到攻击的被遗忘的服务或测试环境。 在这篇文章中,我将向您介绍 SubDomainRadar.io 及其 Python API 包装器 — 自动化子域枚举的终极工具 和 安全工作流程...
    编程 发布于2024-11-06
  • Python 中的 HackerRank 问题 - 基本数据类型列表
    Python 中的 HackerRank 问题 - 基本数据类型列表
    此 Python 代码旨在根据用户提供的命令对列表执行一系列操作。让我们一步步分析代码,了解其工作原理: if __name__ == '__main__': N = int(input()) l = [] while(N>0): cmd_l = inp...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3