gpt4 book ai didi

python - argparse 中的可选 nargs 变量

转载 作者:太空狗 更新时间:2023-10-30 02:57:09 25 4
gpt4 key购买 nike

如何使用带有变量 nargs 的 argparse 进行条件循环?所以,基本上,它应该在有或没有参数的情况下运行。我正在尝试:

parser = argparse.ArgumentParser(description="output parser")
group = parser.add_mutually_exclusive_group()
group.add_argument("--dos", help="get DOSCAR for plot",
nargs="?", metavar=("int"))
args = parser.parse_args()

if args.dos:
if len(args.dos) > 1:
chosen = int(args.dos[0])
chdos = "at_dos"+args.dos[0]+".dat"
else:
chosen = None

inpt = "DOSY"
print(chosen)
print(inpt)

现在,如果我有变量,那么它会打印一些值,错误但有一些值:

$python3 vasp.py --dos 111
111
None # IT SHOULDN'T BE NONE
DOSY

但没有争论。

我也尝试过使用普通的 sys.argv,如:

def get_dos():
if len(sys.argv) > 2:
chosen = int(sys.argv[2])
chdos = "at_dos"+sys.argv[2]+".dat"
else:
chosen = None
inpt = "DOSCAR"
print(sys.argv)

print(args.dos)
print(chosen)
print(inpt)

在这种情况下,当存在选项时,它给出正确的结果:

python3 vasp.py --dos 12
['vasp.py', '--dos', '12']
12
12
DOSCAR

但同样,没有选择:

$python3 vasp.py --dos

我已经尝试过 hpaulj 的建议。它给出:

$python3 tt.py --dos 12
Namespace(dos='12')
1
DOSY

并且没有争论,它仍然没有打印任何东西。

最佳答案

在 Ipython session 中简化解析器:

In [1004]: parser=argparse.ArgumentParser()    
In [1005]: parser.add_argument('--dos', nargs='?')

In [1007]: parser.parse_args('--dos 111'.split())
Out[1007]: Namespace(dos='111')

在这种情况下,args.dos 将是字符串 '111',len 为 3,并且 int(args.dos[0]) 数字 1。将 nargs 留空(默认 None)也会发生同样的情况。

使用 nargs='?' 我也可以使用不带参数的标志,在这种情况下,值为默认值 None

In [1013]: parser.parse_args('--dos'.split())
Out[1013]: Namespace(dos=None)

nargs=?const 一起使用最为有用,它提供了一个方便的 3 向操作。我可以添加 type=int` 以将字符串(如果有)转换为整数。

In [1015]: parser.add_argument('--dos', nargs='?', type=int,
default=None, const=123)

In [1016]: parser.parse_args([]) # not used
Out[1016]: Namespace(dos=None)

In [1017]: parser.parse_args('--dos'.split()) # without argument
Out[1017]: Namespace(dos=123)

In [1018]: parser.parse_args('--dos 456'.split()) # with argument
Out[1018]: Namespace(dos=456)

其他 nargs,例如 1、'*' 和 '+' 给你一个列表,你可以检查它的长度等。

====================

在你的argv 测试中

if len(sys.argv) > 2:
chosen = int(sys.argv[2])
chdos = "at_dos"+sys.argv[2]+".dat"

sys.argv 是一个列表,因此 len 计算是否有足够的元素来应用 sys.argv[2] 步骤。

这不起作用,因为 args.dos 是单个字符串,而不是列表。

if len(args.dos) > 1:
chosen = int(args.dos[0])
chdos = "at_dos"+args.dos[0]+".dat"

len(args.dos) 是字符串中的字符数,args.dos[0] 是第一个字符。

============

如果我定义:

def get_dos(argv=None):
parser=argparse.ArgumentParser()
parser.add_argument('--dos', type=int, nargs='?')
args = parser.parse_args(argv)
chosen = args.dos
if chosen is not None:
chdos = 'at_dos%s.dat'%chosen
else:
chdos = ''
return chosen, chdos

这些测试产生的值我认为符合您的需求:

In [1042]: get_dos([])
Out[1042]: (None, '')

In [1043]: get_dos(['--dos'])
Out[1043]: (None, '')

In [1044]: get_dos(['--dos','123'])
Out[1044]: (123, 'at_dos123.dat')

关于python - argparse 中的可选 nargs 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com