• 初始化
  • 始见参数
    • name or flags
    • action
    • nargs
    • default
    • type
    • choices
    • required
    • help
    • dest
    • metavar
  • 总结

继上次的optparser库之后,才发现自己意外的out of time了。原来标准的argparse库才是处理命令行参数的一剂良方。好记性不如烂笔头,这里还是记录一下,以便今后的复习。


初始化

import argparseparser = argparse.ArgumentParser()

初始化这个类的时候,还是有很多的可选参数的,但是相对而言比较重要的也就是description和version吧。添加的话可以给用户一个更加友好的体验,不加也没啥大不了的。

始见参数

这也是这个库的核心部分了。

# =======================# Adding argument actions# =======================def add_argument(self, *args, **kwargs):"""add_argument(dest, ..., name=value, ...)add_argument(option_string, option_string, ..., name=value, ...)"""# if no positional args are supplied or only one is supplied and# it doesn't look like an option string, parse a positional# argument··· ···

对此有兴趣的不妨研究一下源码。那么,一般而言可以为这个方法添加什么参数呢?

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

对应add_argument方法的说明:

如果该方法没有设置位置参数,或者设置了一个不像可选参数的字符串,就解析为一个位置参数。

什么意思咧,大概就是说会默认将这种情况设置为位置参数,至于位置参数和可选参数的区别,属额外知识,此处略去。

下面就来简单的测试一下这几个参数,来加深一下记忆吧。


必须参数

name or flags

先来看一个不像可选参数的字符串被解析的例子。

再来看一个位置参数的实现。


可选参数

可选参数一定是前面有-号的,但是有-号的不一定是可选参数


action

action比较特殊一点,针对不同的值,这个属性也对应着不同的情况。

  • action='store_const',见名知意。就是指这个本参数对应的值为常量,类比在C++中,常量的值不能随意的更改,一般会在初始化的时候确定下来,这里同样秉承了这个思想,于是这个参数的值便存储在了一个叫const的属性对应的值中。

  • action='store_true/store_false',有了上面的做示范,类比这个也就不难理解了。是的,参数的值会被默认的存储为对应的True或者False。

需要注意的是,以上两个属性值原理类似。也就是说我们不能再为其指定额外的命令行值了,否则就会报错的。

E:\Code\Python\DataStructor\temp>python argptest.py -f foo -b bar
usage: argptest.py [-h] [-f] [-b]
argptest.py: error: unrecognized arguments: foo barE:\Code\Python\DataStructor\temp>
  • action='append',这个时候,命令行中赋予的参数值可以为多个咯,多个参数值会被存储为一个列表。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-l', '--list', action='append')
args = parser.parse_args()
print args
print args.list

但是使用的时候确是 要十分的小心,因为这个库不会自动的帮助我们分割命令行参数来配对,所以我们必须一次一个的为其赋值, 不然它就不能正常的工作了。

E:\Code\Python\DataStructor\temp>python argptest.py -l 1
Namespace(list=['1'])
['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3
Namespace(list=['1', '2', '3'])
['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1
Namespace(list=['1'])
['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3
Namespace(list=['1', '2', '3'])
['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 2 3
usage: argptest.py [-h] [-l LIST]
argptest.py: error: unrecognized arguments: 2 3
  • action='count',统计本参数出现的次数,也就是说add_argument方法内没有此属性的话就不会统计该参数出现的次数了。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-c', '--count', action='count')
args = parser.parse_args()
print args
print args.count

测试结果为:

E:\Code\Python\DataStructor\temp>python argptest.py -c
Namespace(count=1)
1E:\Code\Python\DataStructor\temp>python argptest.py -c -c
Namespace(count=2)
2E:\Code\Python\DataStructor\temp>python argptest.py -c -c -c
Namespace(count=3)
3

这个例子用处不大,但是在某些时候还是很有用的。

nargs

我的理解就是:numbers of arguments。其值为数值类型,外加一个'+'(一个或多个), 一个'*'(零个或多个,更加推荐*),下面就来看个例子吧。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f', '--foo', nargs=1)
parser.add_argument('-b', '--bar', nargs=2)
parser.add_argument('-m', '--many', nargs='+')
args = parser.parse_args()
print args

测试的结果为:

E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m 1 2 3 3 2 1
Namespace(bar=['1', '2'], foo=['1'], many=['1', '2', '3', '3', '2', '1'])
E:\Code\Python\DataStructor\temp>python argptest.py -f 1 2
usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]]
argptest.py: error: unrecognized arguments: 2E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1
usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]]
argptest.py: error: argument -b/--bar: expected 2 argument(s)E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m a s x c d e r f g tt r  w d f f
Namespace(bar=['1', '2'], foo=['1'], many=['a', 's', 'x', 'c', 'd', 'e', 'r', 'f', 'g', 'tt', 'r', 'w', 'd', 'f', 'f'])

不难看出,设置了什么样的约束,就必须按照规定使用了,否则这个库就不能正常的工作了。实际中,需要什么样的就设置成什么样的参数即可。

default

默认参数,这个属性比较的有意思了,而且很容易理解。就是说,如果我们没有在命令行中输入参数对应的值,那么这个值就会使用default属性中设置好的了。这一点看似简单,但意义非凡!

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f1', '--foo1', default=1)
parser.add_argument('-f2', '--foo2', default='string type')
parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args()
print args

测试结果:

E:\Code\Python\DataStructor\temp>python argptest.py
Namespace(foo1=1, foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f1 12
Namespace(foo1='12', foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f2 funny
Namespace(foo1=1, foo2='funny', foo3=[1, 'a', 2, 'b'])

由此,我们可以得到另外一个比较重要的知识点,那就是该库默认将从控制台读取的值转成字符串类型,即使我们预期的不是字符串。这一点引起足够的注意即可。

type

类型约束,有时候会起到画龙点睛的作用。刚好可以完善上面那个类型转换的问题。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f1', '--foo1', default=1)
parser.add_argument('-f2', '--foo2', default='string type')
parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args()
print args

测试结果:

E:\Code\Python\DataStructor\temp>python argptest.py -f 12
Namespace(foo=12)E:\Code\Python\DataStructor\temp>python argptest.py -f '12'
usage: argptest.py [-h] [-f FOO]
argptest.py: error: argument -f/--foo: invalid int value: "'12'"

输入非int类型的数据,就会自动的报错。由此也可见type和default相辅相成的搭配,会使得用户输入的约束更契合。

choices

这个属性意蕴更加明显了吧,就是说用户输入的参数只能是choices里面规定的,这就跟java中的枚举类的使用有点神似咯。刚好可以严格的控制用户输入,毕竟你用于不知道你的用户会输入什么,除非你不给他们任意输入的权限。而choices刚好帮你实现了这个需求。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f', '--foo', choices=[1, 2, 3, 'a', 'abc', 3.141592653589727])args = parser.parse_args()
print args

测试结果:

E:\Code\Python\DataStructor\temp>python argptest.py -f 1
usage: argptest.py [-h] [-f {1,2,3,a,abc,3.14159265359}]
argptest.py: error: argument -f/--foo: invalid choice: '1' (choose from 1, 2, 3, 'a', 'abc', 3.141592653589727)E:\Code\Python\DataStructor\temp>python argptest.py -f a
Namespace(foo='a')

因此,我们要特别注意,从控制台输入的数据会自动的转换成字符串类型,而choices里面的值就必须有点讲究了。我们一定要仔细的思考需要什么类型的数据。如果非要使用int类型的话,就需要搭配type属性了。但是如果既要字符串,又要int的话,这就不好办了。所以,请三思而后行。

required

意指这个参数是必须的吗?属性值有True和False两个取值,按需设置即可。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f', '--foo', required=True)args = parser.parse_args()
print args

测试结果:

E:\Code\Python\DataStructor\temp>python argptest.py -f foooof
Namespace(foo='foooof')E:\Code\Python\DataStructor\temp>python argptest.py
usage: argptest.py [-h] -f FOO

所以说,加了这个属性。对用户的输入的限制就更加的严格一点了。

help

如果说这些属性里面哪个最容易理解?博主想说的就是help了。没有之一。其作用就是在用户输入--help 或者-h的时候显示的帮助信息。这一点非常的有用,因为用户第一次使用你的库的时候对参数的含义一无所知,而help就起到了一个帮助文档的作用。

看起来很有感觉了吧。

dest

此为destination的缩写,也就是说该参数的值将被存储于dest声明的变量中。我们可以借助输出来探查一二。

import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions')
parser.add_argument('-f', '--foo', dest='variable')args = parser.parse_args()
print args.variable
# 注意此时-f对应的参数将变成variable,而不再是foo,所以下面的会报错
print args.foo

测试结果:

E:\Code\Python\DataStructor\temp>python argptest.py -f foo
Namespace(variable='foo')E:\Code\Python\DataStructor\temp>python argptest.py -f foo
fooE:\Code\Python\DataStructor\temp>python argptest.py -f foo
Traceback (most recent call last):File "argptest.py", line 16, in <module>print args.foo
AttributeError: 'Namespace' object has no attribute 'foo'

metavar

这个参数用于help 信息输出中,但是貌似基本上就没人用到过它。所以这里为了不误导自己,误导他人,便不再叙述,有兴趣的可以自行搜索一下。

总结

本文主要讲解了argparse库的使用,图文并茂,代码雨测试结果并行。应该算是比较详细了吧。O(∩_∩)O哈哈~

但是个人觉得貌似和optparser库区别不是很大,大致的用法还是差不多的嘛。有兴趣的话,可以看看下面的这个关于optparser库的讲解的链接。

optparser使用详见:http://blog.csdn.net/Marksinoberg/article/details/51842197

argparse库 学习记录相关推荐

  1. 用c++ 给易语言写支持库学习记录

    废话我就不对说 直接开始 易语言官方下载的易语言安装路径下 有一个SDK文件夹 我们点进入cpp文件夹里面提供是c++的SDK elib文件夹里就是sdk 我们新建一个win32项目 这里我用的是VS ...

  2. Python练习——Turtle库学习记录

    概述: turtle是Python标准库之一,能够进行基本的图形绘制 基本框架: 一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形.对于小海龟来说,有"前进"."后退& ...

  3. python modbus tk 库_python modbus_tk库 学习记录

    注:目前的开发只涉及 modbus master即 client端的开发,未涉及 slave端服务器的开发,slave服务器的设计,一般开发嵌入式设备作为数据采集器的时候用到,市面上有现成的slave ...

  4. fake库学习记录附实例

    之前领导叫我帮忙生成一组不重复的名字,我当时用的是random函数,脚本如下(抄自某网友) import random import timedef random_name():xing = '赵钱孙 ...

  5. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  6. 在别的地方看的给程序员介绍一些C++开源库,记录给大家共同学习

    在别的地方看的<<给程序员介绍一些C++开源库>>,记录给大家共同学习 首先说明这篇文章不是出自我手,大家共同学习. 引用地址:http://oss.org.cn/?actio ...

  7. Python学习记录(一)PIL库对于图像操作方法的简单整理

    Python学习记录(一)PIL库对于图像操作方法的简单整理 首先对PIL库进行一个简单的介绍:Python图像库PIL(Python Image Library)是python的第三方图像处理库,由 ...

  8. ESP32学习记录 OLED u8g2库

    ESP32 OLED & u8g2库 学习 编程环境 ARDUINO环境 VS Code Platformio环境 1. OLED简单显示 显示效果 就连学习也想着可爱囧菌呢!!! main. ...

  9. 大创学习记录(四)之yolov3代码学习

    PyTorch-YOLOv3项目训练与代码学习 借助从零开始的PyTorch项目理解YOLOv3目标检测的实现 PyTorch 对于PyTorch就不用多说了,目前最灵活.最容易掌握的深度学习库,它有 ...

最新文章

  1. python 应声虫怎么做_职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫...
  2. openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)
  3. js 数据类型和转化
  4. 抛弃PHP,WordPress.com以JavaScript重写
  5. QT学习:基于TCP的网络聊天室程序
  6. 关于进程与线程,史上最浅显易懂的一个简单解释!
  7. Applese 涂颜色(欧拉定理降幂+快速幂)
  8. Android--多个Activity共享Socket--单例模式
  9. cf1562D Two Hundred Twenty One
  10. 设计模式6大原则简述
  11. 前端基础-html-表格的基本标签和相关属性
  12. HDU2008 数值统计【入门】
  13. 《软件工程导论》复习知识点总结
  14. 一键配置以太网IP脚本
  15. 网易云音乐Android一面面经
  16. 第十一章 枚举与泛型总结
  17. Kubeadm安装高可用的K8S集群--多master单node
  18. 树莓派——安装OpenCV
  19. Oracle 19C 下载和安装
  20. 用ChatGPT创建虚拟小镇,或许《西部世界》已经成为现实

热门文章

  1. 用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)--生成SSL证书请求...
  2. Binary Tree Level Order Traversal II leetcode java
  3. 080703 雨&星巴克的菜单
  4. Spring中bean的scope详解
  5. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
  6. 【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )
  7. 【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )
  8. 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
  9. 【计算机网络】数据链路层 : 轮询访问 介质访问控制 ( 轮询协议 | 令牌传递协议 )
  10. 【运筹学】线性规划 单纯形法 阶段总结 ( 初始基可行解 | 判定最优解 | 迭代 | 得到最优解 | 全流程详细解析 ) ★