Python 的 argparse 模块的作用,以及分享一个通用代码模板

这篇具有很好参考价值的文章主要介绍了Python 的 argparse 模块的作用,以及分享一个通用代码模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


argparse 是 Python 内置的一个用于命令项选项与参数解析的模块。它的作用是帮助我们处理命令行输入,轻松编写用户友好的命令行接口。

argparse模块有什么用,暂时,Python,argparse,命令行,可选参数,通用 代码模板

命令行接口的需求

  • 假设您编写了一个 Python 脚本,您希望用户能够在运行脚本时提供一些选项或参数。例如,您的脚本可能需要从命令行获取文件路径、模型参数、指定输出目录等。
  • 使用 argparse 模块,可以轻松编写用户友好的命令行界面。程序定义了它需要的参数,argparse 就会找出如何从 sys.argv 中解析出这些参数。argparse 模块还会自动生成帮助和使用信息。如果用户传入无效的参数,argparse 会显示错误消息,帮助用户正确使用程序。

我们根据一个好的代码模块来学习 argparse 模块的使用:

这份代码源自:https://github.com/XinyuanWangCS/PromptAgent/blob/main/src/main.py

import argparse


def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')


def config():
    parser = argparse.ArgumentParser(description='Process prompt search agent arguments')
    parser.add_argument('--task_name', type=str, default='bigbench',  help='This is consistent to the task file names in tasks folder. The default is bigbench task.')  
    parser.add_argument('--search_algo', type=str, default='mcts', choices=['mcts', 'beam'], help='Prompt search algorithm. Choose from \'mcts\' and \'beam\'.')    
    parser.add_argument('--batch_size', type=int, default=5, help='Batch size depending on the memory and model size')
    parser.add_argument('--depth_limit', type=int, default=5, help="The max depth of a single searching path.")
    parser.add_argument('--train_size', type=int, default=None, help="The dataset that sample batches from.")
    parser.add_argument('--eval_size', type=int, default=50, help="Calculate reward on this set.")
    parser.add_argument('--test_size', type=int, default=0, help="Test set size.")
    parser.add_argument('--seed', type=int, default=42, help="The seed to shuffle the dataset.")
    parser.add_argument('--train_shuffle', type=str2bool, default=True, help='Shuffle training set')

    # Search
    parser.add_argument('--init_prompt', type=str, default="Let's solve the problem.", help='Initial prompt written by human.')
    parser.add_argument('--iteration_num', type=int, default=12, help='MCTS iteration number.')
    parser.add_argument('--expand_width', type=int, default=3, help="The number of batches sampled in each expansion.")
    parser.add_argument('--num_new_prompts', type=int, default=1, help="The number of new prompts sampled in each batch.")
    parser.add_argument('--post_instruction', type=str2bool, default=False, help="True: the position of instruction is question+instruction; \nFalse: the position of instruction is instruction+question")

    # MCTS
    parser.add_argument('--min_depth', type=int, default=2, help="Early stop depth: early stop is only applied when depth is larger than min_depth.")
    parser.add_argument('--w_exp', type=float, default=2.5, help="Weight of MCTS.")

    # World Model
    parser.add_argument('--pred_model', type=str, default='gpt-3.5-turbo', help='The base model that makes predictions.')
    parser.add_argument('--optim_model', type=str, default='gpt-4', help='Prompt optimizer.') 
    parser.add_argument('--pred_temperature', type=float, default=0.0)
    parser.add_argument('--optim_temperature', type=float, default=1.0)
    
    # Others
    parser.add_argument('--log_dir', type=str, default='../logs/', help='Log directory.')
    parser.add_argument('--data_dir', type=str, default=None, help='Path to the data file (if needed)')
    parser.add_argument('--api_key', type=str, default=None, help='OpenAI api key or PaLM 2 api key')

    # BeamSearch
    parser.add_argument('--beam_width', type=int, default=3)

    return parser.parse_args()


if __name__ == '__main__':
    args = config()
    print(args, type(args), "\n")
    args = vars(args)
    print(args, type(args), "\n")
    print(f"pred_model: {args['pred_model']}")
    print(f"log_dir: {args['log_dir']}")

实现了一个名为 str2bool 的辅助函数。它接收字符串参数 v 并将其转换为布尔值。如果 v 已经是布尔值,则按原样返回。否则,它会检查 v 的小写版本是否与函数中定义的 true 或 false 表示相匹配。如果匹配,则返回相应的布尔值。如果不符合任何条件,将引发 argparse.ArgumentTypeError 并给出错误信息。

实现一个名为 config() 的函数,用于设置来自 argparse.ArgumentParser 的参数解析器对象。它负责定义和处理命令行参数。argparse 模块对命令行接口的支持是围绕 argparse.ArgumentParser 实例构建的。它是参数规范的容器,具有适用于整个解析器的选项。

位置参数:这些参数是在命令行中按照顺序传递的,不带前缀。例如,parser.add_argument("filename") 表示一个位置参数,用户需要提供一个文件名。

选项参数:这些参数通常以 - 或 -- 开头,可以接受各种值。以下是一些常见的选项参数类型:

  • -c 或 --count:带值的选项,用户可以提供一个计数值。
  • -v 或 --verbose:开关标志,表示是否启用详细输出。
  • -h 或 --help:获取帮助信息。

参数值的类型:

  • int:将参数值自动转换为整数。
  • float:将参数值自动转换为浮点数。
  • str:默认类型,接受字符串值。
  • bool:布尔类型,通常用于开关标志。

ArgumentParser.add_argument() 方法将单独的参数规范附加到解析器上。它支持选项参数、接受值的选项和开/关标志。

  • type:命令行参数应该被转换成的数据类型。例如,int、float、str 等。如果不指定 type,默认是字符串类型。
  • help:参数的帮助信息。当用户请求帮助时,这个描述会显示在命令行用法字符串和各种参数的帮助消息之间。编写清晰、简洁的帮助信息对用户非常重要。
  • default:如果用户未提供某个参数,将使用默认值。

parser.add_argument 依次为解析器添加了各个参数。例如,第一个参数名称为 “–task_name”,这意味着从命令行运行脚本时,可将其作为 --task_name 传递。它需要一个字符串值(type=str),默认值为 “bigbench”。帮助参数提供了参数的说明。类似地,剩下的代码为解析器添加了更多参数,每个参数都有各自的名称、数据类型、默认值和帮助说明。

添加所有参数后,会调用 parser.parse_args() 来解析运行脚本时提供的命令行参数,并将提取的数据放入 argparse.Namespace 对象中。这里注意一下:parser.parse_args() 方法会检查通过命令行传入的参数,并将它们转换为一个命名空间(argparse.Namespace)。如果传入的参数不符合预定义的规则(例如,缺少必需的参数或者参数格式不正确),它会自动显示错误信息并退出程序。

使用了内置函数 vars() 来处理前一步得到的 argparse.Namespace 对象 args。vars() 函数返回对象的 __dict__ 属性,这是一个包含了对象所有属性及其值的字典。因此,通过调用 vars(args),将命名空间对象转换成了一个字典。这样做有几个好处:

  • 可读性:使用字典可使得后续代码更加易读,因为可以直接通过键来访问参数值,而不是通过属性。
  • 灵活性:字典提供了更多操作和遍历元素的方法,使得处理复杂情况时更加灵活。

总的来说,这段代码使用 argparse 设置了一个参数解析器,定义了多个命令行参数及其类型、默认值和帮助信息,解析了所提供的参数,最终以字典形式返回。

代码的运行结果如下:

Namespace(api_key=None, batch_size=5, beam_width=3, data_dir=None, depth_limit=5, eval_size=50, expand_width=3, init_prompt="Let's solve the problem.", iteration_num=12, log_dir='../logs/', min_depth=2, num_new_prompts=1, optim_model='gpt-4', optim_temperature=1.0, post_instruction=False, pred_model='gpt-3.5-turbo', pred_temperature=0.0, search_algo='mcts', seed=42, task_name='bigbench', test_size=0, train_shuffle=True, train_size=None, w_exp=2.5) <class 'argparse.Namespace'> 

{'task_name': 'bigbench', 'search_algo': 'mcts', 'batch_size': 5, 'depth_limit': 5, 'train_size': None, 'eval_size': 50, 'test_size': 0, 'seed': 42, 'train_shuffle': True, 'init_prompt': "Let's solve the problem.", 'iteration_num': 12, 'expand_width': 3, 'num_new_prompts': 1, 'post_instruction': False, 'min_depth': 2, 'w_exp': 2.5, 'pred_model': 'gpt-3.5-turbo', 'optim_model': 'gpt-4', 'pred_temperature': 0.0, 'optim_temperature': 1.0, 'log_dir': '../logs/', 'data_dir': None, 'api_key': None, 'beam_width': 3} <class 'dict'> 

pred_model: gpt-3.5-turbo
log_dir: ../logs/

argparse模块有什么用,暂时,Python,argparse,命令行,可选参数,通用 代码模板

对于 argparse 模块,总结一下:

  • 易于使用:argparse 是 Python 中一个非常实用的模块,用于解析命令行参数。argparse 提供了一种简单的方式来定义和解析命令行参数,使得我们的 Python 脚本能够更好地与命令行接口集成。您可以创建用户友好的命令行接口,使我们的 Python 脚本更易于使用和管理。

  • 灵活性:通过使用 argparse,我们可以轻松地解析命令行参数。它允许您定义各种选项、参数和子命令,从而使您的程序更具灵活性。您可以根据需要添加或修改选项,而无需更改源代码。

  • 自动生成帮助和用法信息:argparse 能够自动生成帮助和用法消息文本。当用户运行您的程序时,只需使用 --help 或 -h 选项,就能获得详细的帮助信息,包括可用选项、参数和用法示例。

  • 错误处理:argparse 在用户向程序传入无效参数时会发出错误消息。这有助于防止用户输入错误的选项或参数,从而提高程序的健壮性。

  • 位置参数和可选参数的灵活组合:argparse 允许您定义位置参数和可选参数,以及它们的组合。位置参数是根据其在命令行中出现的位置来处理的,而可选参数则可以根据用户的选择进行设置。


📚️ 参考链接:文章来源地址https://www.toymoban.com/news/detail-836055.html

  • Python 3.9.18 官方文档 | argparse — Parser for command-line options, arguments and sub-commands
  • 沈向洋:致 AI 时代的我们 —— 请不要忽视写作的魅力

到了这里,关于Python 的 argparse 模块的作用,以及分享一个通用代码模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中argparse模块关于 parse_args() 函数详解(全)

    原理:命令行解析使用argparse包 作用:命令行传参赋值 可用在机器学习深度学习 或者 脚本运行等 了解这个函数需要了解其背后的原理以及具体参数 在深度学习模型框架中几乎都有的模块 浓缩后的示例代码: 主要的对象值赋参,对应的参数具体如下: 主要有两种情况: 位

    2024年02月16日
    浏览(41)
  • 关于python from .. import .. 以及 pycharm对于source root bug的一个通用解决方案

    先说问题         python里默认from .. import .. 这个写法的from会查找当前文件夹下但 不包含当前文件夹 的路径,也就是说 如果from ..的这里写入的是当前文件夹 是会报错的,因为无法找到当前文件夹。 尝试的坑            pycharm的source root。这个是真的坑啊。加了source ro

    2024年02月11日
    浏览(41)
  • Python 中的 multiprocessing 模块和 threading 模块有什么区别?什么情况下应该使用哪一个?解释 Python 中的 __del__ 方法的作用。有什么需要注意的地方解释

    multiprocessing 模块和 threading 模块都是用于在 Python 中进行并发编程的工具,但它们有一些关键的区别。以下是它们之间的比较: 区别: 并行性 vs 并发性: multiprocessing 模块用于创建独立的进程,每个进程都有自己的 Python 解释器和全局解释器锁(GIL)。因此,multiprocessing 允许

    2024年02月22日
    浏览(45)
  • python的虚拟环境图文详解(虚拟环境作用以及虚拟环境搭建,切换,退出,迁移打包)代码演示

    目录 一、虚拟环境 1.1、概念理解 1.2、作用  二、虚拟环境操作教程 2.1、利用pycharm搭建,切换,删除虚拟环境 2.1.1、搭建虚拟环境 2.1.2、切换虚拟环境 ​编辑 2.1.3、删除虚拟环境 2.2、命令行方式搭建(mac/linux/unix) 2.2.1、搭建虚拟环境 2.2.2、切换虚拟环境 2.2.3、删除虚拟环境

    2024年02月15日
    浏览(43)
  • 分享78个Python源代码总有一个是你想要的

    分享78个Python源代码总有一个是你想要的 源码下载链接:https://pan.baidu.com/s/1ZhXDsVuYsZpOUQIUjHU2ww?pwd=8888  提取码:8888 下面是文件的名字。 12个python项目源码 Apache Superset数据探查与可视化平台v2.0.1 API Star工具箱v0.7.2 Archery SQL审核查询平台v1.9.1 ArkID企业级IDaaSIAM平台系统 v2.6.10 bk

    2024年02月07日
    浏览(58)
  • 分享40个Python源代码总有一个是你想要的

    分享40个Python源代码总有一个是你想要的 源码下载链接:https://pan.baidu.com/s/1PNR3_RqVWLPzSBUVAo2rnA?pwd=8888  提取码:8888 下面是文件的名字。 dailyfresh-天天生鲜 Django-Quick-Start freenom-自动续期域名的脚本 Full Stack Python简体中文翻译项目 GLaDOS 自动签到⚡ izone后台管理 learndemo learn_pyt

    2024年02月07日
    浏览(40)
  • 分享57个游戏Python源代码总有一个是你想要的

     分享57个游戏Python源代码总有一个是你想要的 下载链接: https://pan.baidu.com/s/1qeHsJferwBwvwfMY38bxEA?pwd=8888  提取码:8888 游戏项目名称 100%基于Python的,模仿元气骑士的游戏 Firefly是稳定、快速扩展、能 “热更新”的分布式游戏服务器端框架 pygame桌面小游戏 (像素鸟 五子棋)

    2024年02月03日
    浏览(56)
  • 分享一个国内免费的ChatGPT网站,手机电脑通用,免费无限制,支持AI绘画

    背景 AIGC作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大AIGC的网站,终于找到一个免费!手机电脑通用!可直接对话的AIGC,也有各种提供工作效率的工具供大家使用。 产品名称 百晓生 网站地址 https://ai.hxkj.vip 画图

    2024年02月07日
    浏览(98)
  • 以optee的sign_encrypt.py为例讲解argparse命令解析模块

    Argparse是 Python 标准库中推荐的命令行解析模块。该模块会自动生成提示信息,且在用户给程序传入非法参数时报错。 刚好最近在看optee的sign_encrypt.py,以它为例介绍python的argparse命令解析模块。 脚本参见:optee_os/scripts/sign_encrypt.py at master · OP-TEE/optee_os · GitHub ArgumentParser 对象

    2024年02月10日
    浏览(47)
  • 通用的改进遗传算法求解带约束的优化问题(MATLAB代码精讲、实际工程经验分享)

    在对多约束、非线性问题的求解上,传统线性规划等方法往往无法有效求解(求解时间过长、无法处理非线性约束等。 进化算法是一类强有力的工具,已经在多个领域有了较为成功的应用。然而,在利用遗传算法、粒子群等等进化算法求解实际的优化问题时,还存在许多困难

    2023年04月19日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包