python参数有或没有值,指定与否
Posted
技术标签:
【中文标题】python参数有或没有值,指定与否【英文标题】:python argument with or without value, specified or not 【发布时间】:2018-11-25 00:30:45 【问题描述】:场景如下:
我需要实现一个允许两者的命令行参数系统
-p <value>
和
-p
(没有给出 -p 的值)
有什么方法可以使用 argparse 来实现,还是我必须手动解析 sys.argv?
非常感谢你!!!
【问题讨论】:
ArgumentParser: Optional argument with optional value -nargs='?' with
const` 和 default
。
【参考方案1】:
当未指定选项(或未指定参数)时,这会将 args.param 设置为 None
,否则设置为指定值
import argparse
UNSPECIFIED = object()
parser = argparse.ArgumentParser()
parser.add_argument('-p', action='store', dest='param', default=UNSPECIFIED, nargs='?')
args = parser.parse_args()
if args.param == UNSPECIFIED:
print("Param unspecified")
else:
print(args.param)
【讨论】:
显然,不起作用。如果-p
不带参数指定,则会失败。
编辑添加nargs
,现在将接受-p
没有价值
没有办法知道是否没有指定 -p
或者它没有参数(param
在两种情况下都应为 None )开箱即用。然而,if('-p' in sys.argv):
的解决方法很简单;所以我会把它标记为答案。非常感谢!!!
使用nargs='?',还可以指定一个'const'参数【参考方案2】:
你需要的是三种状态,不在场、在场、在场有价值。
argparse 模块提供了至少两种简单的方法来做到这一点。
为了最简单、最灵活,您只需要添加 action='store' 和 nargs='*'。
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-p', action='store', nargs='*')
args = parser.parse_args()
if args.p is not None:
print( '-p present' )
else:
print( '-p not present' )
print( '-p value', args.p )
以下是此方法的输出:
# ./testpar.py
-p not present
-p value None
# ./testpar.py -p
-p present
-p value []
# ./testpar.py -p something
-p present
-p value ['something']
# ./testpar.py -p something anotherthing
-p present
-p value ['something', 'anotherthing']
对于第二种方法,您可以为三种状态中的第二种设置特定值,const=somevalue 和 nargs='?'。此方法仅支持一个值,并且“const”的值必须是用户输入的无效值。
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-p', action='store', const='NoValue', nargs='?')
args = parser.parse_args()
if args.p:
print( '-p present' )
else:
print( '-p not present' )
print( '-p value', args.p )
这是您对这三种情况的输出,
# ./testpar.py
-p not present
-p value None
# ./testpar.py -p
-p present
-p value NoValue
# ./testpar.py -p something
-p present
-p value something
【讨论】:
arparse 如何消除./test -p pval posarg1
和./test -p posarg1
之间的歧义?
答案:无法消除歧义。那么,这个 narg=?当您也有位置参数时,它并不是很有用。
@alexei 第一个适用于您的情况。我刚刚修正了一个错字。试试看。
刚刚再次尝试使用 nargs='?'和 nargs='*',两者都不能消除歧义。第一个位置参数被解释为标志参数的值。
使用 parser.add_argument('-p', action='store', nargs='*'),如果 -p 未指定,或者包含零个或一个或两个项目的列表,我将一无所获在列表中取决于提供了多少参数。我实际上在部署的代码中使用它,多年来,它有效。以上是关于python参数有或没有值,指定与否的主要内容,如果未能解决你的问题,请参考以下文章