argument和parameter的区别:

其实跟今天的主题没多大关系, 顺便说一下, 因为看一些英文的技术文章, 会经常用这两个概念.
parameter就相当于java里的"形参":
方法/函数定义时在括号里的参数

def explain_param_vs_arg(param1, param2):print param1, param2

argument就是所谓"实参":
调用方法/函数时括号里的参数

explain_param_vs_arg("arg1", "arg2")

Positional arguments:

例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo

输出:

$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo$ python prog.py --help
usage: prog.py [-h] echopositional arguments: echo
optional arguments: -h, --help show this help message and exit$ python prog.py foo
foo

上面的例子,基本没什么用. 来个有用点的:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print args.echo

输出:

$ python prog.py -h
usage: prog.py [-h] echopositional arguments:echo     echo the string you use hereoptional arguments:-h, --help       show this help message and exit

加了help参数之后, -h就加了对echo这个参数的说明.
来个更有用点的:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print args.square**2

输出:

$ python prog.py 4
Traceback (most recent call last):File "prog.py", line 5, in <module>print args.square**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

结果不太理想. 是因为argparse把我们给的参数认成了string. 我们得告诉TA把square当成int来处理:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",type=int)
args = parser.parse_args()
print args.square**2

运行结果:

$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

这把就对了. 如果参数非法了还会报错.

Optional arguments

前面介绍了positional arguments. 接下来我们看看optional arguments:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:print "verbosity turned on"

输出:

$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]optional arguments:-h, --help                      show this help message and exit--verbosity VERBOSITYincrease output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument

看看都发生了什么:

  • 这段代码是想在--verbosity被赋值的时候显示点什么, 没被赋值的时候什么都不显示.
  • 所谓optional arguments, 取意译就是"选择性参数". 我们可以看到当不使用--verbosity的时候是不会报错的. args.verbosity的值也是None
  • help信息也显示有点不一样. 加了[--verbosity VERSOSITY].
  • 当我们使用--verbosity的时候, 就要给TA赋个值, 否则会报错.

上面的例子可以接受任意的整数作为--verbosity的值, 但对我们这简单的小程序来说, 只有俩个值是有用的, True或者False. 我们改一下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",action="store_true")
args = parser.parse_args()
if args.verbose:print "verbosity turned on"

输出:

$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h] [--verbose]optional arguments:
-h, --help      show this help message and exit
--verbose       increase output verbosity

说明:

  • 这个选项现在不止是一个需要赋值的flag. 我们甚至给TA改了个名字. 我们还新指定了一个关键字, action. 同时吧TA赋值成"store_true". 这么做的意思是, 如果使用verbose, 就把True赋值给args.verbose. 如果不使用, 就给TA赋False.
  • 注意help text也发生了变化.

Short options

如果你经常用terminal命令行模式, 你就会发现我还没说short options. 实现起来其实非常简单.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', help='increase output verbosity',action='store_true')
args = parser.parse_args()
if args.verbose:print 'verbosity turned on'

输出:

$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]optional arguments:
-h, --help   show this help message and exit
-v, --verbose   increase output verbosity

可以看到在help text里有对应的改变.

混用positional和optional arguments

让代码来的更复杂点吧:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('square', type=int,help='display a square of a given number')
parser.add_argument('-v', '--verbose', action='store_true',help='increase output verbosity')
args  = parser.parse_args()
answer = args.square ** 2
if args.verbose:print 'the square of {} equals {}'.format(args.square, answer)
else:print answer

输出:

$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16
  • 我们又把那个positional argument带回来了
  • 注意, 赋值的顺序并没影响

我们再把以前的verbosity也带回来:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity")
args = parser.parse_args()
answer = args.square ** 2
if args.verbosity == 2: print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1: print "{}^2 == {}".format(args.square, answer)
else: print answer

输出:

$ python prog.py 4
16
$ python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python prog.py 4 -v 1
4^2 == 16
$ python prog.py 4 -v 2
the square of 4 equals 16
$ python prog.py 4 -v 3
16

看起来都工作的挺好, 除了, 最后好像是有点bug. 我们来通过限定--verbosity来fix它:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")
args = parser.parse_args()
answer = args.square ** 2
if args.verbosity == 2: print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:print "{}^2 == {}".format(args.square, answer)
else: print answer

输出:

$ python prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] squarepositional arguments: square           display a square of a given number
optional arguments: -h, --help      show this help message and exit -v {0,1,2}, --verbosity {0,1,2}increase output verbosity

可以看到在error message里也反应出我们的改变.
接下来, 我们来看下verbosity的另一种玩法, 这种玩法其实更常见, 更符合cpython使用参数的风格(试试python --verison):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity")
args = parser.parse_args()
answer = args.square ** 2
if args.verbosity == 2:print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:print "{}^2 == {}".format(args.square, answer)
else:print answer

这回我们用了另一个action: "count". 去统计一个optional argument的出现次数.

$ python prog.py 4
16
$ python prog.py 4 -v
4^2 == 16
$ python prog.py 4 -vv
the square of 4 equals 16
$ python prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python prog.py 4 -h
usage: prog.py [-h] [-v] squarepositional arguments:square     display a square of a given numberoptional arguments: -h, --help     show this help message and exit-v, --verbosity   increase output verbosity
$ python prog.py 4 -vvv
16
  • 跟前面的"store_true"一样, 如果不使用, 就会默认赋值为"None".
  • 这就是action"count"的效果. 你们肯定也在其他程序中见过.
  • 最后的输出还是看起来怪怪的.

我们来fix一下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",help="increase output verbosity")
args = parser.parse_args()
answer = args.square ** 2# bugfix: replace == with >=
if args.verbosity >= 2:print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity >= 1:print "{}^2 == {}".format(args.square, answer)
else:print answer

来看看结果:

$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last): File "prog.py", line 11, in <module>if args.verbosity >= 2:
TypeError: unorderable types: NoneType() >= int()
  • 从前两个输出看起来工作的不错, fix了我们的bug.
  • 但从最后一个输出看工作的不怎么理想啊...

继续fix:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,help="display a square of a given number")
parser.add_argument("-v", "--verbosity",action="count", default=0, help="increase output verbosity")
args = parser.parse_args()
answer = args.square ** 2
if args.verbosity >= 2:print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity >= 1:print "{}^2 == {}".format(args.square, answer)
else:print answer

我们这里介绍了另一个keyword, default. 用了default就会把默认值设置成0. 一定要记住如果不给positional argument赋值, 默认的就会赋值为None. 是不能跟数字做比较的.

$ python prog.py 4
16

目前介绍的功能已经能应付很多情况了. 在结束之前, 我们再来点更猛的吧.

更高级的用法

我们扩展一下这个例子, 来显示更多内容:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x ** args.y
if args.verbosity >= 2:print "Running '{}'".format(__file__)
if args.verbosity >= 1:print "{}^{} == {}".format(args.x, args.y, answer)
print answer

输出:

$ python prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
$ python prog.py -h
usage: prog.py [-h] [-v] x ypositional arguments:x     the base y     the exponentoptional arguments:-h, --help   show this help message and exit-v, --verbosity
$ python prog.py 4 2 -v
4^2 == 16
$ python prog.py 4 2 -v
4^2 == 16
$ python prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16

处理冲突

我们在例子中加一个argument: --quiet. quiet表示如果不想用verbose的显示方式就用quiet. 它们是互斥的关系. 我们可以这么实现:

import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x ** args.yif args.quiet:print answer
elif args.verbose:print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:print "{}^{} == {}".format(args.x, args.y, answer)

输出:

$ python prog.py 4 2
4^2 == 16
$ python prog.py 4 2 -q
16
$ python prog.py 4 2 -v
4 to the power 2 equals 16
$ python prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

最后, 如果你想告诉用户程序的主要目的. 可以这么来:

import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x ** args.y
if args.quiet:print answer
elif args.verbose:print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:print "{}^{} == {}".format(args.x, args.y, answer)

输出:

$ python prog.py --help
usage: prog.py [-h] [-v | -q] x ycalculate X to the power of Ypositional arguments:x     the base y     the exponentoptional arguments:-h, --help     show this help message and exit-v, --verbose-q, --quiet

作者:Edward_f0cus
链接:https://www.jianshu.com/p/a50aead61319
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

argument和parameter的区别:相关推荐

  1. java argument是什么_第2期:argument、parameter以及option有什么区别?

    日常交流中,我们通常用参数一词说明函数或者命令的使用方法,比如: HashMap 可以通过构造函数的 initialCapacity 参数设置初始容量,我传的 参数 是 1000. rm 命令 -r ...

  2. variable argument parameter的区别

    今天看书,发现ARG是argument 的缩写,意思是参数 于是想到parameter也是参数,这两个有啥区别咧? 于是去问度娘... 结果查出这么个东西 ---------------------- ...

  3. localparam和parameter的区别

    Verilog代码可移植性设计 1.       参数定义 localparam,实例代码如下: module tm1( clk,rst_n, pout ); input clk; input rst ...

  4. Attribute 和 Parameter 的区别

    (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方法 (2)当两个Web组件之间为链接关系时,被链接的组件通过getParameter ...

  5. springboot---request 中Parameter,Attribute区别

    HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下区别: (1)HttpServletRequest类有setAttri ...

  6. localparam,parameter,define区别

    一.localparam是局部参数,不能被重定义,不可用于参数传递,也就是在实例化时不能通过层次引用进行重定义,只能通过源代码改变. 二.parameter作用于声明的那个文件,可以通过#(参数)进行 ...

  7. (Swift)Missing argument for parameter #1 in call

    2019独角兽企业重金招聘Python工程师标准>>> 出现问题原因: 在类方法里面调用对象方法 解决方法: // 调用对象方法的时候在前面加上<#类名#>().< ...

  8. property field java_Java 中 field 和 variable 区别及相关术语解释

    原标题:Java 中 field 和 variable 区别及相关术语解释 先说一下 field 和 variable 之间的区别: class variables and instance vari ...

  9. python参数类型_Python 参数类型和参数匹配模型

    Python 方法的参数种类有很多,而不是通常语言定义的那样, Python 方法的传参能力要比想象的强大很多.很多初学者可能对一些库中带 * 带 ** 的参数类型非常奇怪,但是其实这些语法正是保证 ...

最新文章

  1. Nature Protocols | 密歇根州立大学何胜阳/Tiedje团队建立拟南芥微生物组研究的标准化生长体系!...
  2. python返回错误提示_python 错误处理
  3. 模拟电路技术之基础知识(八)
  4. 搭建consul 集群
  5. MFC 网络编程 -- 总结
  6. 【shell】awk的next用法
  7. URLSearchParams 接口
  8. 【计算机网络复习 数据链路层】3.5.2 ALOHA协议
  9. JSP中嵌入java代码方式以及指令
  10. SQL 拼接语句输出_一文了解Mybatis中动态SQL的实现
  11. 把文件放在Linux内存里
  12. 未来教育计算机二级考生文件夹打不开,未来教育计算机二级office题库
  13. java中拦截器和过滤器详解
  14. 20221126给Chrome浏览器安装扩展程序——猫抓
  15. vc使用默认的浏览器打开网页代码
  16. NetInside可观测分析平台上线了
  17. android和chrome的发展与未来[j].移动通信,基于Android手机app开发与设计 毕业设计 开题报告...
  18. mysql错误:ERROR 145 (HY000): Table './zentao/zt_action' is marked as crashed and should be repaired
  19. Linux系统yum源的三种配置方法
  20. 文本基本样式及盒模型

热门文章

  1. Netty + Web聊天室
  2. 均方距离计算公式_Excel2013中通过公式计算方差与均方差来反映数据的偏移程度...
  3. linux查看某个端口的流量_linux流量查看工具汇总
  4. 口腔溃疡怎么办最快最有效的方法 口腔溃疡缺什么维生素
  5. R语言按照城市取样(一个城市有多行观测,想筛选一些城市)
  6. ubuntu系统制作usb启动盘
  7. 刘鹏计算广告学1:广告的基本知识(一)
  8. 算法相关-互联网计算广告学
  9. 大数据——把Kafka中的数据传输到HBase中
  10. Java书签 #MyBatis之setMapperLocations配置多个mapper路径的两种方法详解