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=somevaluenargs='?'。此方法仅支持一个值,并且“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参数有或没有值,指定与否的主要内容,如果未能解决你的问题,请参考以下文章

C#基础 一(方法详解)

python 第十二天2018.04.01 带参数的装饰器,,函数的有用信息

Python函数默认参数设置(超级详细)

python基础-函数

从0开始的Python学习009参数

Python参数基础