带值或不带值的 python 参数,指定或未指定

gle*_*ezo 7 python argv argparse

场景如下:

我需要实现一个命令行参数系统,该系统允许

-p <value>

-p

(没有给出 -p 的值)

有什么方法可以使用 argparse 来实现此目的,或者我必须手动解析 sys.argv 吗?

非常感谢你!!!

DrM*_*DrM 7

你需要的是三种状态:缺席、存在、存在且有价值。

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 )
Run Code Online (Sandbox Code Playgroud)

这是此方法的输出:

# ./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']
Run Code Online (Sandbox Code Playgroud)

对于第二种方法,您可以为三个状态中的第二个设置一个特定值,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 )
Run Code Online (Sandbox Code Playgroud)

这是三种情况的输出,

# ./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
Run Code Online (Sandbox Code Playgroud)


kri*_*aps 5

None当未指定选项(或未指定参数)时,这会将 args.param 设置为指定值,否则设置为指定值

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)
Run Code Online (Sandbox Code Playgroud)

  • 显然,不工作。如果不带参数指定“-p”,则会失败。 (2认同)