【问题标题】:How to access optional parameter in this case?在这种情况下如何访问可选参数?
【发布时间】:2013-10-11 00:40:46
【问题描述】:

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

我有一个类似的解析器

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 的方式有误,请告诉我?

【问题讨论】:

  • 这个确切的代码对我来说很好用(在文件顶部添加一个import argparse)。你用的是什么版本的python?

标签: python argparse


【解决方案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']

【讨论】:

  • 有什么办法可以改变顺序吗?这样首先需要 tableName、duration 和其他
  • 您可以使用parse_known_args。查看我的编辑。
【解决方案2】:

生成的命名空间是:

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 之类的选项放在位置之前
  • 使用“+”代替“*”或“REMAINDER”
  • 通过几个步骤解析输入。

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多