Python 的 argparse模块用于解析命令行参数,使得脚本能够灵活地接受用户从命令行传入的各种参数,从而根据不同的参数配置来执行不同的操作。
argparse.ArgumentParser 是 Python 中 argparse 模块的核心类,用于创建一个解析器对象,该对象能够读取和解析命令行参数和选项,将它们转换为相应的数据类型,并提供给程序使用。
常用功能有
功能 | 描述 |
---|---|
解析命令行参数 | 能够识别命令行中输入的各种参数,包括位置参数(positional arguments)和可选参数(optional arguments),并将它们解析为程序可用的值。 |
自动生成帮助文档 | 当用户在命令行中使用 -h 或 --help 选项时,自动显示程序的用法说明和参数描述,方便用户了解程序的参数要求和功能 。 |
参数类型检查和转换 | 支持对参数的类型进行检查和转换,如将字符串参数转换为整数、浮点数等指定类型,确保程序接收到的参数类型正确。 |
默认值设置 | 可以为参数指定默认值,当用户未提供该参数时,程序会使用默认值,提高了程序的灵活性和易用性。 |
参数验证 | 通过自定义的验证函数,可以对参数的值进行进一步的验证,确保参数满足特定的条件和约束。 |
通过调用 argparse.ArgumentParser() 创建一个解析器对象,可以传入一些可选参数来定制解析器的行为,如 description 用于描述程序的用途,prog 用于指定程序名称等。
parser = argparse.ArgumentParser()
使用解析器对象的 add_argument 方法添加参数。该方法的常见参数如下:
参数名称 | 描述 |
---|---|
name or flags | 参数的名称或选项标志,例如 --foo 或 -f 。 |
action | 指定当参数出现时应采取的动作,常见的有 store (保存参数值,默认动作)、store_true (保存 True 值,当参数出现时)、store_false (保存 False 值,当参数出现时)、append (将值追加到列表中)等。 |
nargs | 指定参数值的数量,可以是具体数字、'?' (可选参数,可提供 0 或 1 个值)、'*' (零个或多个值)、'+' (一个或多个值)等。 |
const | 当 action 是 store_const 时,用于指定保存的常量值。 |
default | 指定参数的默认值。 |
type | 指定参数的类型,如 int 、float 、str 等。 |
choices | 指定参数值的可选集合,当参数值不在该集合中时,会报错。 |
required | 指定参数是否为必需的,对于可选参数,默认为 False ,对于位置参数,默认为 True 。 |
help | 提供参数的简短描述,用于生成帮助文档。 |
dest | 指定参数值在解析后的命名空间对象中的属性名,默认为参数名称或标志去掉前导 - 后的名称。 |
调用解析器对象的 parse_args 方法解析命令行参数,返回一个命名空间对象,其中包含了所有解析后的参数值。可通过对象的属性名来访问各个参数的值。
args = parser.parse_args()
import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='一个示例程序')
# 添加参数
parser.add_argument('--foo', type=int, default=42, help='一个整数参数,默认值为42')
parser.add_argument('bar', type=str, help='一个位置参数,表示文件路径')
# 解析参数
args = parser.parse_args()
# 使用参数值
print('foo 的值:', args.foo)
print('bar 的值:', args.bar)
运行python script.py -h
usage: script.py [-h] [--foo FOO] bar
一个示例程序
positional arguments:
bar 一个位置参数,表示文件路径
optional arguments:
-h, --help show this help message and exit
--foo FOO 一个整数参数,默认值为42
运行python script.py file.txt --foo 100
上面命令意味着args.foo 的值为 100,args.bar 的值为 ‘file.txt’。
部分 | 含义 |
---|---|
python |
指定使用 Python 解释器运行脚本。 |
script.py |
要运行的 Python 脚本文件名。 |
file.txt |
位置参数,表示文件路径,存储到 args.bar 中。 |
--foo |
选项参数标志,表示一个整数参数,存储到 args.foo 中。 |
100 |
选项参数 --foo 的值,表示该参数的具体数值。 |
论文代码示例
if __name__ == '__main__':
# Python 脚本的入口点,使用 argparse 模块解析命令行参数,然后调用 run 函数执行主要逻辑
parser = argparse.ArgumentParser()
# 指定要使用的语言模型
parser.add_argument('--llm', type=str, default='gpt-3.5')
# 指定任务类型,例如 'csqa'、'math' 等
parser.add_argument('--task', type=str)
# 指定上下文选择的参数,可能用于控制生成答案时的上下文策略
parser.add_argument('--cot', type=str, help='context selection')
# 指定运行的样本数量,-1 表示运行所有样本
parser.add_argument('--num', type=int, default=-1, help='number of running samples, -1 for all samples')
# 指定防御策略,可能用于对抗攻击
parser.add_argument('--defense', type=str, default=None)
# 是否启用攻击模式,即是否向问题中添加触发器
parser.add_argument('-attack', action='store_true', default=False, help='whether add trigger to test question')
# 指定触发器的标识符,可能从 triggers.json 文件中加载
parser.add_argument('--trigger', type=str, default="s01", help='id of trigger for triggers.json')
# 指定 API ID,可能用于访问语言模型的 API
parser.add_argument('--api_id', type=int, default='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')
# 是否仅执行评估,而不运行模型生成
parser.add_argument('-eval_only', action='store_true', default=False, help='whether only eval the output file')
# 每个问题的输出数量,默认为 1,大于 1 时用于自洽性(self-consistency)
parser.add_argument('--sc', type=int, default=1, help='number of output per question, default 1. More than 1 set for self-consistency')
# 指定用于抽样的索引文件标识符
parser.add_argument('--index', type=str, default=None, help='subsampling index file identifier to run')
# 指定从哪个索引恢复执行
parser.add_argument('--resume', type=int, default=-1, help='resume index')
# 是否不覆盖已有的输出文件
parser.add_argument('-not_overwrite', action='store_true', default=False, help='whether not overwrite the existing output file')
# 是否随机化问题的顺序
parser.add_argument('-rand', action='store_true', default=False, help='whether randomize the order of questions')
# 指定触发器在问题中的位置。
parser.add_argument('--tp', type=str, default=None, help='trigger position for question')
# 指定评估时的样本数量,-1 表示评估所有样本
parser.add_argument('--eval_num', type=int, default=-1, help='number of samples for eval, -1 for all samples')
'''
使用 parse_args 方法解析命令行传入的参数,解析后的参数会存储在 args 对象中,
后续可以通过 args.参数名 的方式来获取各个参数的值,例如 args.llm 获取模型名参数的值。
'''
args = parser.parse_args()
'''
在解析完参数后,调用 run 函数,并将解析后的参数对象 args 作为参数传递给该函数,
函数内部会根据这些参数的值来执行相应的逻辑和操作,完成程序的主要功能
'''
run(args)