0

在这种情况下如何访问可选参数?

我有一个解析器

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 正在返回 None

如何访问“持续时间”?

请给我建议解决方案...

请让我知道我用于 nargs 的方式是否错误?

4

2 回答 2

1

您应该首先放置可选参数:

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']
于 2013-10-10T08:03:59.033 回答
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=REMAINDERnargs='*'。现在第一个案例给出

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位置之前
  • 使用 '+' 而不是 '*' 或 'REMAINDER'
  • 分几步解析输入。
于 2013-10-10T16:08:43.340 回答