我有一个简单的 argparse 脚本,它需要两个参数;--encode
和--decode
。--decode
如果没有给出参数,我想设为默认值。我该怎么做?
我要这个:
myscript.py --decode "some encoded string here"
当我这样做时发生:
myscript.py "some encoded string here"
默认。
查看python 文档,甚至是add 参数方法上的 default'store_true' action
关键字
您需要实现一些逻辑,但这里的想法是:
parser.add_argument('--decode', rest_of_options..., default=True)
parser.add_argument('--encode', rest_of_options..., default=False)
values = parser.parse_args()
if values.decode:
do_some_stuff
elif values.encode:
do_some_other_stuff
您可以使用default
参数指定默认值,以及dest
控制选项的变量名称:
import argparse
p = argparse.ArgumentParser()
# --decode and --encode are usually considered mutually exclusive; this enforces that constraint
g = p.add_mutually_exclusive_group()
# Order matters: the first default for a given dest is used
g.add_argument('--decode', dest='action', action='store_const', const='decode', default='decode')
g.add_argument('--encode', dest='action', action='store_const', const='encode')
这近似于您想要的,除了缺少的“--”
p.add_argument('action',choices=['decode','encode'],default='decode',nargs='?')
p.add_argument('astring')
In [8]: p.parse_args(["a string"])
Out[8]: Namespace(action='decode', astring='a string')
In [9]: p.parse_args(['decode',"a string"])
Out[9]: Namespace(action='decode', astring='a string')
In [10]: p.parse_args(['encode',"a string"])
Out[10]: Namespace(action='encode', astring='a string')
如果你必须有'--',nneonneo 的解决方案很好,产生相同的命名空间。两个参数都写入相同的目标属性,默认情况下该属性是“解码”。
p.add_argument('--decode', dest='action', action='store_const', const='decode', default='decode')
p.add_argument('--encode', dest='action', action='store_const', const='encode')
如果您不使用互斥组,则最后一个参数将具有最终决定权 ( '--decode --encode "a string to be encoded"'
)
在argparse.ArgumentParser()
您使用方法时的对象中:add_argument
是一个标志default="some value"
,例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--test', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)
输出:
>python test.py
Namespace(test=None)
添加默认标志:
parser.add_argument('--test', nargs='?', const=1, type=int, default=2)
add_argument 更改后:
>python test.py
Namespace(test=2)