知道在使用Python的argparse时用户是否指定了参数

时间:2014-01-16 15:01:45

标签: python default-value argparse

假设我有一个使用argparse的python测试,有几个参数:

  • IP(默认值:127.0.0.1)
  • enabled_features(默认:[A,B,C])

有时,我想更改默认的enabled_features,让我们说[A,B,C,D]:

  • 取决于我需要知道IP的东西(所以它不能真正成为argparse默认值的默认值)
  • 仅当用户未指定“enabled_features”时...这就是我无法知道的事情!

在argparse类中有一个属性要知道:

opts = parser.parse_args()

...一个参数实际上是由用户指定的,即一个人使用了类似的东西:

$ python my_test.py --enabled_features A B C

而不是:

$ python my_test.py

谢谢!

3 个答案:

答案 0 :(得分:3)

opts包含argparse可以为您提供的所有信息。因此,您必须测试某个默认值(最常见的是None),或者缺少属性(如果default=argparse.SUPPRESS)。

另一种方法是指定合理的default,而不用担心用户是否在输入中指定了这些或其他值。更重要的是,用户是指定了值还是值本身?

答案 1 :(得分:0)

像...一样的东西。

myopts = vars(opts)
if opts['enabled_features'] is None:
    #Set the default parameters as you please.

允许您查看是否在命令行中指定了opt(假设您已将参数添加到解析器中)。

答案 2 :(得分:0)

parser object itself保存了一些有用的信息,我们可以用这些信息检查添加参数时分配的默认值。

示例脚本parser_ex.py

import argparse

def specified_nondefault(opts, parser, arg):
  """
  Checks whether an argument was specified to be something other than the 
  default value.

  ..Note: This doesn't actually check if the argument was specified, as it
          can be 'tricked' by the user specifying the default value.

  :param argparse.Namespace opts: Parsed arguments to check.
  :param argparse.Parser parser: The parser they were parsed with.
  :param str arg: The name of the argument in question.
  :return bool: Whether the current argument value differs from the default.
  """

  if getattr(opts, arg) == parser.get_default(arg):
    return False
  return True

parser = argparse.ArgumentParser()

parser.add_argument('enabled_features', nargs='*', default=['A', 'B', 'C', 'D'])

opts = parser.parse_args()

print specified_nondefault(opts, parser, 'enabled_features')

在哪种情况下:

>> parser_ex.py 'B' True

因为我们做了一些非默认的事情。而

>> parser_ex.py 'A' 'B' 'C' 'D' False

>> parser_ex.py False

因为这只是默认输入。

请注意,因为我们正在检查整个列表,所以有些不合适的行为会导致重要事项和

>> parser_ex.py 'B' 'A' 'C' True

IMO,这是将所有功能集中到一个参数中的问题,但如果你愿意,你当然可以以某种方式解决它。

然后,如果用户有/未指定非defualt enabled_features,您可以根据需要更改IP