是否可以使用argparse
来捕获任意一组可选参数?
例如,以下两项都应被接受为输入:
python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3
python script.py required_arg1 --varA valueA --var2 value2 --varB valueB
先验我不知道会指定哪些可选参数接收,但会相应地处理它们。
答案 0 :(得分:23)
这是一种hackish方式,但效果很好:
检查,未添加哪些参数并添加它们
parser=argparse.ArgumentParser()
parser.add_argument("foo")
parser.add_argument("-bar", type=int)
#parser can have any arguments, whatever you want!
parsed, unknown = parser.parse_known_args() #this is an 'internal' method
# which returns 'parsed', the same as what parse_args() would return
# and 'unknown', the remainder of that
# the difference to parse_args() is that it does not exit when it finds redundant arguments
for arg in unknown:
if arg.startswith(("-", "--")):
#you can pass any arguments to add_argument
parser.add_argument(arg, type=<your type>, ...)
args=parser.parse_args()
例如:
python arbitrary_parser.py ha -bar 12 -lol huhu -rofl haha
然后结果将是
args = Namespace(bar=12, foo='ha', lol='huhu', rofl='haha')
答案 1 :(得分:2)
可能?可能,但我不推荐它。 argparse
是解析此类输入的最佳工具,或者相反,argparse
从usage
角度来看这是一个糟糕的参数规范。
您是否考虑过sys.argv
行应该是什么样的?如何向用户解释这一点?
您如何直接从 prog = sys.argv[0]
arg1 = sys.argv[1]
keys = sys.argv[2::2]
# maybe strip -- off each
values = sys.argv[3::2]
kvdict = {k:v for k, v in zip(keys, values)}
解析此工作?看起来你可以收集3件:
key:value
还有其他SO问题询问通用 --args key1:value1 key2:value2
对。比如:
nargs='*'
这可以通过:
处理,并在=
(或key
)上分割每个输入字符串并按argparse
存储内容。
您的要求最不适合argv
使用,因为它要求绕过将参数标记与argparse
中的字符串匹配的整个想法。它需要,一些方法,关闭所有正常的#stred {
width: 90%;
margin: 0 auto;
}
#img {
width: 80%;
}
#center {
text-align: center;
}
#container1 {
float: left;
width: 100%;
padding: 10px;
box-sizing: border-box;
overflow: auto;
}
#col1 {
float: left;
width: 25%;
background: red;
padding: 20px;
box-sizing: border-box;
}
#col2 {
float: left;
width: 25%;
background: yellow;
padding: 20px;
box-sizing: border-box;
}
#col3 {
float: left;
width: 25%;
background: green;
padding: 20px;
box-sizing: border-box;
}
#col4 {
float: left;
width: 25%;
background: blue;
padding: 20px;
box-sizing: border-box;
}
@media screen and (max-width: 500px) {
#stred {
width: 100%;
}
#container1 {
float: left;
width: 100%;
overflow: auto;
height: auto;
}
#col1 {
float: left;
width: 50%;
background: red;
}
#col2 {
float: left;
width: 50%;
background: yellow;
}
#col3 {
float: left;
width: 50%;
background: green;
}
#col4 {
float: left;
width: 50%;
background: blue;
}
}
解析。
看起来几年前我提出了同样的建议
Parse non-pre-defined argument
或更早