Python 是一门功能强大的编程语言,能够让开发者创建从基础脚本到大型软件系统的各类应用。最常见的编程任务之一是创建命令行界面(CLI),它允许用户通过终端或命令行与程序交互。对于脚本编写、自动化以及图形界面不实用的场景,CLI 至关重要。
处理命令行参数是设计 CLI 的重要部分。这些参数允许用户在程序运行时通过传入输入参数来影响程序行为。若无法处理这些因素,程序的通用性会降低,也更难针对特定任务进行调整。
Python 提供了多个用于解析命令行参数的模块,但 argparse 模块因其简单而全面而脱颖而出。argparse 模块让开发功能完善的命令行界面变得轻松。它会自动处理参数解析、显示有用的说明,并在用户提供错误信息时给出错误提示。
在本教程中,我们将了解如何使用 Python 的 argparse 包。我们会先概览 Python 的命令行界面以及解析命令行输入的重要性,然后再讨论 argparse 模块及其优势。
Python 中命令行界面概览
命令行界面是纯粹基于文本命令运行的程序。用户在终端或命令行中输入命令,通常包含参数和选项,用于改变程序的行为。CLI 的优势在于它易于自动化,并能与其他技术轻松集成。
在 Python 中,可以通过编写一个接收命令行输入的脚本来创建 CLI。该输入通常表现为脚本可访问并解释的参数列表。对于基础程序,通过 sys.argv 列表手动处理这些参数可能已足够。然而,随着程序复杂度提升,手动处理参数会变得低效且易出错。
解析命令行参数的重要性
解析命令行参数之所以必要,原因包括:
- 灵活性:通过接收参数,程序无需修改代码即可执行多种任务或处理不同的数据集。用户可以指定要处理的文件、配置设置以及选择运行模式。
- 易用性:恰当的参数解析能够让程序显示有用信息,引导用户正确使用,并优雅地处理错误。
- 可维护性:使用专门的解析模块(如 argparse)可使代码更清晰、更易维护。它将参数解析逻辑与程序的主要功能相分离。
argparse 模块简介及其优势
argparse 模块属于 Python 标准库的一部分,因此无需安装任何额外包即可使用。它为解析命令行输入提供了简明一致的接口。使用 argparse 的优势包括:
- 自动生成帮助:根据代码中的参数自动生成帮助和用法信息。
- 错误处理:当用户输入无效参数时显示有用的错误信息。
- 类型转换:可将参数字符串自动转换为合适的数据类型。
- 同时简洁地支持必要的位置参数和可选参数。
- 默认值:允许为用户未提供的参数设置默认值。
argparse 使开发者能够专注于程序的核心功能,同时依托稳健的基础来管理命令行输入。
设置 argparse 与基础用法
现在我们已了解解析命令行参数的重要性以及使用 argparse 的优势,接下来看看如何在 Python 脚本中进行设置与使用。
安装与导入 argparse
无需单独安装任何组件,因为 argparse 是 Python 标准库的一部分。您可以在脚本开头直接导入它。
import argparse
这行代码将 argparse 模块加载到您的脚本中,使您可以使用其功能来解析命令行参数。
创建一个简单的参数解析器
使用 argparse 的第一步是创建一个解析器对象。该对象会存储程序可接受的参数信息,并用于解析命令行输入。
parser = argparse.ArgumentParser(description='Process some integers.')
在此示例中,我们创建了一个 ArgumentParser() 对象并为程序添加了描述。当用户选择帮助选项(-h 或 --help)时,将显示该描述。
添加位置参数和可选参数
解析器创建好后,我们即可指定程序将接收哪些参数。
添加位置参数
位置参数是必需的,且必须按特定顺序提供。例如,考虑一个将两个数相加的脚本。我们可以为两个数定义两个位置参数:
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
在这段代码中,num1 和 num2 表示位置参数。
type=int 表示应将参数转换为整数。help 参数用于提供将在帮助信息中显示的说明。
添加可选参数
可选参数不是必需的,通常用于提供额外选项或改变程序行为。它们通常以一个或两个短横线作为前缀。我们将添加一个可选参数以启用详细输出:
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
说明如下:
- 短选项是
-v(例如-v)。--verbose是长选项。 action='store_true'表示如果选择了该选项,verbose 属性将被设为True;否则为False。help参数为帮助信息提供说明。
解析参数并访问其值
在指定完所有参数后,需要解析命令行输入。使用 .parse_args() 方法来完成。
args = parser.parse_args()
解析后的参数将作为属性存储在 args 变量中。我们可以通过点号访问它们。
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Verbose mode is enabled.')
把所有内容整合起来,下面是一个完整脚本,用于相加两个数,并包含可选的详细模式:
import argparse
parser = argparse.ArgumentParser(description='Add two integers.')
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
args = parser.parse_args()
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Calculation completed successfully.')
您可以从命令行运行此脚本并提供所需的位置参数:
python add_numbers.py 3 5
The sum of 3 and 5 is 8
如果包含 -v 或 --verbose 选项,脚本将打印额外的详细消息:
python add_numbers.py 3 5 --verbose
The sum of 3 and 5 is 8
Calculation completed successfully.
如果用户使用 -h 或 --help 选项运行脚本,argparse 将显示自动生成的帮助信息:
python add_numbers.py -h
usage: add_numbers.py [-h] [-v] num1 num2
Add two integers.
positional arguments:
num1 The first number to add.
num2 The second number to add.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Increase output verbosity.
该功能通过提供清晰的使用说明,使您的程序更为友好。
高级参数处理
在 Python 中开发命令行程序时,您可能会遇到需要更复杂参数解析的场景。Python 的 argparse 模块包含多个功能来满足这些复杂需求,帮助您开发灵活且易用的界面。
使用 nargs 处理多个参数
有时,您的应用需要为同一个参数接收多个值。例如,假设您希望创建一个一次性处理多个文件的脚本。argparse 中的 nargs 参数允许您指定应读取多少个命令行参数。
如下使用 nargs 接收多个文件名:
import argparse
parser = argparse.ArgumentParser(description='Process multiple files.')
parser.add_argument('filenames', nargs='+', help='List of files to process.')
args = parser.parse_args()
for filename in args.filenames:
print(f'Processing file: {filename}')
# Add your file processing code here
在此示例中,nargs='+' 指示解析器在 filenames 中期望一个或多个参数。用户可按需提供任意数量的文件名,它们会保存在名为 args.filenames 的列表中。
如果您想接收确定数量的参数,请将 nargs 设置为该数字。例如,nargs=2 要求恰好两个参数。
使用 choices 限制参数取值
有时,您希望将某个参数限制在指定范围的有效值内。这能确保用户提供有效输入,避免错误或意外行为。choices 参数可用于为某个参数指定允许值。
考虑一个脚本,它根据用户选择的模式执行不同的操作。
import argparse
parser = argparse.ArgumentParser(description='Perform actions in different modes.')
parser.add_argument('--mode', choices=['backup', 'restore', 'delete'], required=True, help='Mode of operation.')
args = parser.parse_args()
if args.mode == 'backup':
print('Backing up data...')
# Backup code here
elif args.mode == 'restore':
print('Restoring data...')
# Restore code here
elif args.mode == 'delete':
print('Deleting data...')
# Delete code here
在此脚本中,--mode 参数必须为上述选项之一。若用户输入列表外的值,argparse 将返回错误信息。
处理布尔标志与开关
布尔标志是用于启用或禁用应用中特定功能的选项。它们通常无需显式值,只需在命令中包含该标志即可。您可以通过 action 参数在 argparse 中处理这些标志。
例如,让我们在脚本中加入调试模式:
import argparse
parser = argparse.ArgumentParser(description='A script with debug mode.')
parser.add_argument('--debug', action='store_true', help='Enable debug output.')
args = parser.parse_args()
if args.debug:
print('Debug mode is enabled.')
# Additional debug information here
else:
print('Debug mode is disabled.')
使用 action='store_true' 后,存在 --debug 标志时 args.debug 为 True,否则为 False。
设置默认值与必需参数
可选参数通常包含合理的默认值。这意味着当用户未指定该参数时,应用会使用默认值。可通过 default 参数指定默认值。
示例如下:
import argparse
parser = argparse.ArgumentParser(description='Adjust program settings.')
parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
在此场景中,如果用户未指定 --timeout,默认为 30 秒。
若要将可选参数设为必填,设置 required=True。
import argparse
parser = argparse.ArgumentParser(description='Send a message.')
parser.add_argument('--recipient', required=True, help='Recipient of the message.')
args = parser.parse_args()
print(f'Sending message to {args.recipient}.')
脚本现在将要求提供 --recipient 参数。
自定义帮助与错误信息
为用户提供清晰、有用的信息是开发高效命令行程序的重要组成部分。Python 的 argparse 模块会自动创建帮助信息,但您也可以根据需要进行修改。
生成自动帮助信息
默认情况下,argparse 会生成帮助信息,用户可通过 -h 或 --help 访问。该信息包含程序用法、描述以及每个参数的说明。
例如:
import argparse
parser = argparse.ArgumentParser(description='Calculate factorial of a number.')
parser.add_argument('number', type=int, help='The number to calculate the factorial for.')
args = parser.parse_args()
当用户使用 -h 运行脚本时,将看到:
usage: script.py [-h] number
Calculate factorial of a number.
positional arguments:
number The number to calculate the factorial for.
optional arguments:
-h, --help show this help message and exit
该自动帮助信息无需额外工作就能提供有用内容。
自定义帮助描述与用法信息
虽然默认帮助信息很实用,但您可能希望对其进行调整,以提供更多信息或符合特定结构。您可以在 ArgumentParser 中修改 description、epilog 和 usage 文本。
例如,包含结语并自定义用法信息:
import argparse
parser = argparse.ArgumentParser(
description='Convert temperatures between Celsius and Fahrenheit.',
epilog='Enjoy using the temperature converter!',
usage='%(prog)s [options] temperature')
parser.add_argument('temperature', type=float, help='Temperature value to convert.')
parser.add_argument('--to-fahrenheit', action='store_true', help='Convert Celsius to Fahrenheit.')
parser.add_argument('--to-celsius', action='store_true', help='Convert Fahrenheit to Celsius.')
args = parser.parse_args()
此时用户查看帮助信息时,将看到自定义的描述、用法和结语:
python file.py --help
usage: p.py [options] temperature
Convert temperatures between Celsius and Fahrenheit.
positional arguments:
temperature Temperature value to convert.
options:
-h, --help show this help message and exit
--to-fahrenheit Convert Celsius to Fahrenheit.
--to-celsius Convert Fahrenheit to Celsius.
管理错误处理与用户反馈
如果用户输入了无效参数,argparse 将显示错误信息并退出程序。您可以修改此行为,以提供更有用的反馈或以不同方式处理失败。
一种做法是在 ArgumentParser 的子类中重写 error 方法:
import argparse
import sys
class CustomArgumentParser(argparse.ArgumentParser):
def error(self, message):
print(f'Error: {message}')
self.print_help()
sys.exit(2)
parser = CustomArgumentParser(description='Divide two numbers.')
parser.add_argument('numerator', type=float, help='The numerator.')
parser.add_argument('denominator', type=float, help='The denominator.')
args = parser.parse_args()
if args.denominator == 0:
parser.error('Denominator cannot be zero.')
result = args.numerator / args.denominator
print(f'Result: {result}')
如果用户在此脚本中尝试除以零,应用将显示错误警告和帮助文本,引导用户提供有效数据。
Python file.py 6 0
Error: Denominator cannot be zero.
usage: file.py [-h] numerator denominator
Divide two numbers.
positional arguments:
numerator The numerator.
denominator The denominator.
options:
-h, --help show this help message and exit
您也可以在脚本中加入自定义错误处理。例如,处理无效文件路径:
import argparse
import os
parser = argparse.ArgumentParser(description='Read a file and display its contents.')
parser.add_argument('filepath', help='Path to the file.')
args = parser.parse_args()
if not os.path.exists(args.filepath):
parser.error(f"The file {args.filepath} does not exist.")
with open(args.filepath, 'r') as file:
contents = file.read()
print(contents)
使用无效路径运行脚本将显示如下错误:
python app..py file
usage: p.py [-h] filepath
app.py: error: The file file does not exist.
真实案例与使用场景
了解如何在真实环境中使用 argparse 模块有助于更清晰地把握其功能。下面我们看看在实际应用中使用 argparse 的一些示例。
构建命令行计算器
假设您需要开发一个简单计算器,可在命令行中执行基础算术运算。该计算器应接收两个数字和一个运算符,以执行所需计算。
实现思路如下:
import argparse
parser = argparse.ArgumentParser(description='Simple command-line calculator.')
parser.add_argument('num1', type=float, help='First number.')
parser.add_argument('operator', choices=['+', '-', '*', '/'], help='Operation to perform.')
parser.add_argument('num2', type=float, help='Second number.')
args = parser.parse_args()
if args.operator == '+':
result = args.num1 + args.num2
elif args.operator == '-':
result = args.num1 - args.num2
elif args.operator == '*':
result = args.num1 * args.num2
elif args.operator == '/':
if args.num2 == 0:
print('Error: Division by zero is not allowed.')
exit(1)
result = args.num1 / args.num2
print(f'The result is: {result}')
在此脚本中,使用 argparse 定义了三个位置参数:两个数字和一个运算符。choices 参数将运算符限制为有效的算术符号。用户运行脚本时即可执行如下计算:
python calculator.py 10 + 5
The result is: 15.0
这个基础计算器展示了命令行选项如何增强程序的灵活性与交互性。
创建具有多种选项的文件处理脚本
假设您需要一个处理文本文件的脚本,并提供指定输出文件、选择处理模式以及启用详细输出等选项。
以下是设置示例:
import argparse
parser = argparse.ArgumentParser(description='Process text files.')
parser.add_argument('input_file', help='Path to the input file.')
parser.add_argument('-o', '--output', help='Path to the output file.')
parser.add_argument('-m', '--mode', choices=['uppercase', 'lowercase'], default='uppercase', help='Processing mode.')
parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output.')
args = parser.parse_args()
# Read the input file
with open(args.input_file, 'r') as file:
content = file.read()
if args.verbose:
print(f'Reading from {args.input_file}')
# Process the content
if args.mode == 'uppercase':
processed_content = content.upper()
else:
processed_content = content.lower()
if args.verbose:
print('Processing content')
# Write to the output file or print to console
if args.output:
with open(args.output, 'w') as file:
file.write(processed_content)
if args.verbose:
print(f'Writing output to {args.output}')
else:
print(processed_content)
该脚本接收一个输入文件,并提供输出文件、处理模式和详细输出等选项。用户无需更改代码即可调整脚本行为。
python text_processor.py input.txt -o output.txt --mode lowercase -v
Reading from input.txt
Processing content
Writing output to output.txt
开发带有子命令的 CLI 工具
在更复杂的应用中,可能需要像 git 一样的子命令机制,例如 git commit 和 git push。argparse 模块提供了子解析器(subparsers)来实现这一点。
如下创建带有子命令的 CLI 工具:
import argparse
parser = argparse.ArgumentParser(description='Manage tasks.')
subparsers = parser.add_subparsers(dest='command', required=True)
# Subcommand 'add'
parser_add = subparsers.add_parser('add', help='Add a new task.')
parser_add.add_argument('name', help='Name of the task.')
parser_add.add_argument('-p', '--priority', type=int, choices=range(1, 6), default=3, help='Priority of the task.')
# Subcommand 'list'
parser_list = subparsers.add_parser('list', help='List all tasks.')
parser_list.add_argument('-a', '--all', action='store_true', help='List all tasks, including completed ones.')
# Subcommand 'complete'
parser_complete = subparsers.add_parser('complete', help='Mark a task as completed.')
parser_complete.add_argument('task_id', type=int, help='ID of the task to complete.')
args = parser.parse_args()
if args.command == 'add':
print(f"Adding task '{args.name}' with priority {args.priority}")
# Code to add the task
elif args.command == 'list':
print('Listing tasks')
if args.all:
print('Including completed tasks')
# Code to list tasks
elif args.command == 'complete':
print(f'Marking task {args.task_id} as completed')
# Code to complete the task
在此示例中,脚本包含三个子命令:add、list 和 complete。每个子命令都有各自的参数。用户运行脚本时,先输入子命令,再提供相应参数。
例如:
python task_manager.py add "Write report" -p 2
Adding task 'Write report' with priority 2
列出任务
python task_manager.py list
Listing tasks
将任务标记为已完成:
python task_manager.py complete 3
Marking task 3 as completed
subparsers 能让您创建结构良好、易于扩展的复杂命令行工具,从而在单一界面中构建可执行多种任务的应用程序。
Python argparse 最佳实践与技巧
开发命令行程序不仅要让代码可用,还要让代码清晰、可维护且易于使用。
以下是在使用 argparse 模块时的一些最佳实践。
为可读性与可维护性组织代码
当脚本变得更复杂时,保持代码结构清晰对于理解和维护至关重要。实现这一点的一种方式是使用函数和类来组织代码的不同部分。
将程序拆分为更小、可复用的片段更易于管理,也能避免代码重复。
例如,在任务管理脚本中,您可以为添加任务、列出任务和完成任务分别定义函数。这种划分使您能够一次专注于一部分逻辑,从而让代码更清晰。
另一种有效技巧是将参数解析逻辑与其余代码分离。将所有参数定义与解析放在脚本开头或专门的函数中,有助于他人更容易理解程序如何处理输入。
使用恰当的变量名也能提升可读性。选择能反映其用途的变量名,使任何查看代码的人都能读懂意图。添加注释与 docstrings 说明函数的作用及关键细节,也能帮助提升理解。
测试与调试命令行应用
测试应用对于确保其正常工作并及早发现问题至关重要。使用 unittest 或 pytest 等 Python 测试框架编写单元测试是测试代码的理想方式。这些测试允许您模拟各种输入,确保函数按预期运行。
例如,您可以通过模拟命令行输入来测试多种场景,而无需从命令行运行脚本。此策略可确保参数解析按预期工作,并且您的应用能够正确处理各种情况。
优雅地处理异常同样重要。通过使用 try-except 块,您可以捕获错误并向用户提供有用的信息。这会让您的应用更稳定、更友好。
同时考虑在脚本中加入调试标志。该标志可启用额外输出,便于在出现问题时跟踪程序执行。在开发与维护期间具备此选项更易于定位问题。
将 argparse 与其他参数解析库对比
虽然 argparse 是 Python 标准库中的有用工具,但还有其他可用于解析命令行参数的库。了解这些选项有助于您为项目选择合适工具。
其中一个库是 Click。Click 是一个第三方包,使用装饰器来创建命令行界面。它语法更直观,适用于复杂应用。例如,您可以使用Python 装饰器来创建命令和选项,使代码更紧凑、易懂。
Docopt 是另一个选择,它允许您使用程序的文档字符串来定义命令行界面。只要在文档字符串中包含用法说明,Docopt 就会自动解析帮助信息并构建参数解析器。该方法优雅,适用于需要更易读规范的简单脚本。
在选择使用哪种库时,请考虑项目需求。如果您希望避免外部依赖,并需要一个能应对大多数场景的工具,argparse 是极佳选择。若您更偏好直观语法并在开发复杂应用,Click 可能更合适。对于界面简洁的小型程序,Docopt 则是不错的选择。
结论
在本文中,我们探讨了如何使用 Python 的 argparse 模块来开发命令行程序。通过实际示例,我们学习了如何创建能接收用户输入并完成相关任务的实用脚本。
从设计基础计算器到开发带有子命令的任务管理工具,argparse 模块提供了应对多种场景所需的灵活性。通过遵循代码组织、完善测试以及权衡替代库等最佳实践,您可以构建可靠且易于维护的应用程序。
无论您是在自动化任务、分析数据,还是构建复杂工具,掌握命令行参数解析都能提升您编写高效 Python 程序的能力。通过我们的Python 基础技能路径进一步提升您的 Python 水平。
Python argparse 常见问题
如何在 argparse 中将可选参数设为必填?
在 argparse 中,可选参数按定义通常不是必需的。但有时您希望以 -- 开头的参数是必填项。要实现这一点,在添加该参数时将 required 参数设置为 True。
具体如下:
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', required=True, help='Path to the input file.')
args = parser.parse_args()
print(f'Input file: {args.input}')
如何在 argparse 中处理互斥参数?
有时您可能会遇到不应同时使用的参数。例如,脚本可以接受 --verbose 或 --quiet,但不能二者同时存在。为解决此类情况,argparse 支持定义互斥组。
设置方法如下:
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='Enable verbose output.')
group.add_argument('--quiet', action='store_true', help='Enable quiet mode.')
args = parser.parse_args()
if args.verbose:
print('Verbose mode is on.')
elif args.quiet:
print('Quiet mode is on.')
else:
print('Default mode is on.')
该脚本允许用户启用 verbose 或 quiet 模式,但不能同时启用。如果尝试同时使用两个选项,argparse 将抛出错误。
如何使用 argparse 从文件而不是命令行读取参数?
尽管 argparse 旨在解析命令行参数,您也可能希望从文件中读取参数。您可以先从文件中读取参数,然后通过 parse_args() 方法的 args 参数传入它们。
示例如下。
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', help='Path to the input file.')
parser.add_argument('--output', help='Path to the output file.')
# Read arguments from a file
with open('args.txt', 'r') as file:
file_args = file.read().split()
args = parser.parse_args(file_args)
print(f'Input file: {args.input}')
print(f'Output file: {args.output}')
在此情况下,args.txt 文件的内容可能为:
--input data/input.txt --output data/output.txt
脚本从文件中读取参数,将其转换为列表,然后传给 parse_args()。这样您就可以在文件中管理参数,而无需每次都手动输入。
如何在 argparse 的帮助信息中显示默认值?
默认情况下,argparse 不会在帮助信息中显示参数的默认值。如果您希望在帮助文本中包含默认值,可以修改 help 参数,或使用 ArgumentDefaultsHelpFormatter。
如下在帮助信息中显示默认值:
import argparse
parser = argparse.ArgumentParser(
description='Process some data.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--timeout', type=int, default=60, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
使用 ArgumentDefaultsHelpFormatter 后,帮助信息将显示 --timeout 参数的默认值:
usage: script.py [-h] [--timeout TIMEOUT]
Process some data.
optional arguments:
-h, --help show this help message and exit
--timeout TIMEOUT Timeout in seconds. (default: 60)
这为用户提供了有关程序默认设置的更多信息。
使用 argparse 的命令行应用有哪些测试最佳实践?
测试命令行应用可能较为困难,但有方法可以简化。一个有用的方式是使用 unittest 模块来模拟命令行参数。
下面是使用 argparse 测试脚本的示例:
import unittest
import argparse
import sys
def create_parser():
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--number', type=int, help='A number.')
return parser
def main(args):
parser = create_parser()
parsed_args = parser.parse_args(args)
if parsed_args.number is None:
parser.error('No number provided.')
result = parsed_args.number * 2
return result
class TestMain(unittest.TestCase):
def test_main_with_number(self):
test_args = ['--number', '5']
result = main(test_args)
self.assertEqual(result, 10)
def test_main_without_number(self):
test_args = []
with self.assertRaises(SystemExit):
main(test_args)
if __name__ == '__main__':
unittest.main()
在该测试脚本中:
- create_parser() 方法用于初始化参数解析器。
- main() 函数处理参数并执行主要逻辑。
- TestMain 类提供用于模拟不同命令行输入的测试方法。
- 测试可确保程序在多种输入下的响应符合预期。
将代码结构化,分离参数处理与核心逻辑,能够更容易地测试程序的不同部分。