argparse库 学习记录
继上次的optparser库之后,才发现自己意外的out of time了。原来标准的argparse库才是处理命令行参数的一剂良方。好记性不如烂笔头,这里还是记录一下,以便今后的复习。
初始化
import argparse
parser = 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 bar
E:\Code\Python\DataStructor\temp>
action='append'
,这个时候,命令行中赋予的参数值可以为多个咯,多个参数值会被存储为一个列表。
import argparse
parser = 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 argparse
parser = 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)
1
E:\Code\Python\DataStructor\temp>python argptest.py -c -c
Namespace(count=2)
2
E:\Code\Python\DataStructor\temp>python argptest.py -c -c -c
Namespace(count=3)
3
这个例子用处不大,但是在某些时候还是很有用的。
nargs
我的理解就是:numbers of arguments。其值为数值类型,外加一个'+'
(一个或多个), 一个'*'
(零个或多个,更加推荐*),下面就来看个例子吧。
import argparse
parser = 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: 2
E:\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 argparse
parser = 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 argparse
parser = 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 argparse
parser = 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 argparse
parser = 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 argparse
parser = 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
foo
E:\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库 学习记录的更多相关文章
- 用c++ 给易语言写支持库学习记录
废话我就不对说 直接开始 易语言官方下载的易语言安装路径下 有一个SDK文件夹 我们点进入cpp文件夹里面提供是c++的SDK elib文件夹里就是sdk 我们新建一个win32项目 这里我用的是VS ...
- JSTL标签库学习记录1-c
JSTL全称为JSP Standard Tag Library,即JSP标准标签库. 导入JSTL相关的JAR包,jstl.jar standard.jar 导入jstl标签库: <%@tagl ...
- JSTL标签库学习记录2-fmt
fmt的标签为辅助性功能标签 设置编码 <fmt:requestEncoding value=""> 国际化相关 <fmt:setLocale value=&qu ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录7-设计和UI之控件和模式4
UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- [ZHUAN]Flask学习记录之Flask-SQLAlchemy
From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...
- 开源项目Material Calendar View 学习记录 (一)
开源项目Material Calendar View 学习记录 Github: https://github.com/prolificinteractive/material-calendarview ...
- Vue学习记录第一篇——Vue入门基础
前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...
随机推荐
- a标签点击页面刷新但还保存当前点击的class是激活的状态
$(".shop-list1").find("li").each(function(){ var href=$(this).attr(&q ...
- 玩一玩基于Token的 自定义身份认证+权限管理
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- C++ 前期准备
在线编译网站: http://www.dooccn.com/cpp/ 刷题: https://leetcode.com/ https://leetcode-cn.com/
- ReactNative Android之原生UI组件动态addView不显示问题解决
ReactNative Android之原生UI组件动态addView不显示问题解决 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com ...
- [NOI 2014]起床困难综合症
Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...
- [HAOI2011]Problem c
题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来 了以后尝试坐到ai,如果ai被占据了,就尝试ai+ ...
- 【BZOJ1059】【ZJOI2007】矩阵游戏
Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...
- POJ2135:Farm Tour
题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路 题解:可以定义一个源点s,和一个汇点t s和1相连容量为2,费用为0, t和n相连容量为2,费用为0 然后所用的边的容量都定为 ...
- BZOJ4870: [Shoi2017]组合数问题
4870: [Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ...
- 2015 多校联赛 ——HDU5305(搜索)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...