【问题标题】:Python argparse store_true and store optional option in one argument [duplicate]Python argparse store_true 并将可选选项存储在一个参数中[重复]
【发布时间】:2013-04-16 15:31:47
【问题描述】:

我需要识别是单独给出参数还是带有可选字符串或两者都没有

parser.add_argument(???)
options = parser.parse_args()

所以

./prog.py --arg

应该将'' 存储到options.arg 中,

./prog.py --arg=lol

'lol' 存储到 options.arg 和

./prog.py

将 options.arg 保留为 None

现在我有:

parser.add_argument("--arg", nargs="?",type=str,dest="arg")

但是当我以 ./prog.py --arg 运行 myprogram 时,options.arg 仍然是 None。识别 --arg 的唯一方法是以./prog.py --arg= 运行它,这对我来说是个问题。

【问题讨论】:

  • 为什么需要区分''Nonenot ''not None 都计算为 True。听起来你有比这更大的问题。
  • @MartijnPieters -- 这是重复的,但是 FWIW,有一个 nicer answer 贡献了这个......我们都被 Evert 忍过了。

标签: python optional-parameters argparse


【解决方案1】:

使用const 关键字:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg", nargs="?", type=str, dest="arg", const="")
print(parser.parse_args([]))
print(parser.parse_args(['--arg']))
print(parser.parse_args(['--arg=lol']))

结果

Namespace(arg=None)
Namespace(arg='')
Namespace(arg='lol')

【讨论】:

  • 现在,这太棒了。甚至是documented behavior (+1)
  • 非常感谢。现在我看到我在学习时错过了 const docs.python.org/2/library/argparse.html
  • @mgilson:感谢文档指针。忘了把那个放进去。不,我无意忍者的答案;-)。
  • 我真的很高兴。我今天学到了一些新东西。
【解决方案2】:

您可以通过自定义操作来做到这一点:

import argparse
parser = argparse.ArgumentParser()
class ArgAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        if values:
            setattr(namespace,self.dest,values)
        else:
            setattr(namespace,self.dest,'')

parser.add_argument("--arg",nargs='?',action=ArgAction,dest="arg")
print parser.parse_args("--arg".split())
print parser.parse_args("--arg=foo".split())

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 2013-05-14
    • 2017-11-28
    • 2019-11-17
    • 2019-07-12
    • 2015-07-20
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多