在这种情况下如何访问可选参数?
我有一个像
这样的解析器import argparse
parser = argparse.ArgumentParser(prog='some_prog',formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("tableName")
parser.add_argument("--duration",help = """It is an optional parameter.""")
parser.add_argument("columns",nargs=argparse.REMAINDER)
args = parser.parse_args()
print args.duration
当我使用命令提示符执行“python some_prog.py T1 --duration = 1278678-3275678678 column1 column2”时
args.duration返回无
如何访问“持续时间”?
请建议我解决方案......
如果我使用的方式是错误的,请告诉我?
答案 0 :(得分:0)
您应首先放置可选参数:
python some_prog.py --duration=1278678-3275678678 T1 column1 column2
适合我。
T1将分配到tableName
,而“column1 column2”将分配到columns
这是因为在获得位置参数tableName
之后,其余部分将作为argparse.REMAINDER
的一部分。
我记得在另一个SO问题中看到这个,但我找不到它。
为了能够将tableName
作为第一个参数,您可以使用parse_known_args
代替parse_args
并删除column
的定义:
import argparse
parser = argparse.ArgumentParser(prog='some_prog',formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("tableName")
parser.add_argument("--duration",help = """It is an optional parameter.""")
(args, the_rest) = parser.parse_known_args()
print args.tableName
print args.duration
print the_rest
将给出:
T1 1234 ['column1', 'column2']
答案 1 :(得分:0)
生成的命名空间是:
Namespace(columns=['--duration=1278678-3275678678', 'column1', 'column2'], duration=None, tableName='T1')
columns
抓住了所有内容,REMAINDER
。
如果我给它:"--duration=1278678-3275678678 T1 column1 column2"
,我得到:
Namespace(columns=['--duration=1278678-3275678678', 'column1', 'column2'], duration=None, tableName='T1')
我们将nargs=REMAINDER
更改为nargs='*'
。现在第一个案例给出了
error: unrecognized arguments: column1 column2
问题在于如何消耗可以采用零个或多个值的位置。请参阅此SO讨论:https://stackoverflow.com/a/18645430/901925 'Python argparse: Combine optional parameters with nargs=argparse.REMAINDER.
简而言之columns
要么消耗T1
之后的所有内容,要么消耗[]
和T1
之间的--duration
。
将其更改为nargs='+'
,它有效。为什么?因为它必须匹配一个或多个字符串。现在它不适应差距。
在其他SO线程和Python错误(混合选项和位置)上引发了这个问题
但与此同时,你的选择是:
--duration
之类的选项