检查是否设置了argparse可选参数

Mad*_*ent 95 python argparse

我想检查用户是否设置了可选的argparse参数.

我可以使用isset安全地检查吗?

像这样的东西:

if(isset(args.myArg)):
    #do something
else:
    #do something else
Run Code Online (Sandbox Code Playgroud)

对于float/int/string类型参数,这是否相同?

我可以设置一个默认参数并检查它(例如,为字符串设置myArg = -1或"",或"NOT_SET").但是,我最终想要使用的值仅在稍后的脚本中计算.因此我将其设置为-1作为默认值,然后将其更新为其他内容.与简单地检查该值是否由用户设置相比,这看起来有点笨拙.

小智 122

我认为如果没有提供可选参数(指定--),则初始化为None.所以你可以试试is not None.试试下面的例子:

import argparse as ap

def main():
    parser = ap.ArgumentParser(description="My Script")
    parser.add_argument("--myArg")
    args, leftovers = parser.parse_known_args()

    if args.myArg is not None:
        print "myArg has been set (value is %s)" % args.myArg
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是它不起作用然后参数得到了它的'default`值定义. (25认同)
  • “is None”和“is not None”测试完全按照我的意愿和预期工作。谢谢。 (4认同)
  • 如果你想设置一个`default`,你仍然可以设置`nargs ='?'`并提供一个`const`值,如[文档]中所述(https://docs.python.org/3/库/ argparse.html#NARGS).当arg不存在时,使用`default`,当arg给出w/o值时,则使用`const`,否则使用给定的值.只有`default`和`nargs ='?'`,如果没有给出,则使用`default`,如果给定w/o值则使用`None`,否则给定给定的值. (4认同)

hpa*_*ulj 30

正如@Honza所说,这is None是一个很好的考验.这是默认设置default,用户无法为您提供复制它的字符串.

您可以指定另一个default='mydefaultvalue,并测试它.但是如果用户指定了该字符串呢?这是否算作设定?

你也可以指定default=argparse.SUPPRESS.然后,如果用户不使用该参数,它将不会出现在args命名空间中.但测试可能更复杂:

args.foo # raises an AttributeError
hasattr(args, 'foo')  # returns False
getattr(args, 'foo', 'other') # returns 'other'
Run Code Online (Sandbox Code Playgroud)

在内部parser保留一个列表seen_actions,并将其用于"必需"和"互相排斥"测试.但它不适合你parse_args.


Era*_*aes 15

我认为使用该选项default=argparse.SUPPRESS最有意义.然后,不是检查参数是否,而是检查not None参数是否in是结果命名空间.

例:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--foo", default=argparse.SUPPRESS)
ns = parser.parse_args()

print("Parsed arguments: {}".format(ns))
print("foo in namespace?: {}".format("foo" in ns))
Run Code Online (Sandbox Code Playgroud)

用法:

$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
Run Code Online (Sandbox Code Playgroud) 不提供参数:
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False
Run Code Online (Sandbox Code Playgroud)


Har*_*ler 9

您可以使用store_truestore_false参数操作选项检查可选的传递标志:

import argparse

argparser = argparse.ArgumentParser()
argparser.add_argument('-flag', dest='flag_exists', action='store_true')

print argparser.parse_args([])
# Namespace(flag_exists=False)
print argparser.parse_args(['-flag'])
# Namespace(flag_exists=True)
Run Code Online (Sandbox Code Playgroud)

这样,您不必担心按条件检查is not None.你只需检查TrueFalse.在此处阅读有关这些选项的更多信息

  • 这并不能解决知道是否设置了具有值的参数。这里的主要问题是要知道 args 值是来自 defaul="" 还是由用户提供。 (4认同)

yPh*_*hil 5

如果您的参数是位置的(即它没有" - "或" - "前缀,只是参数,通常是文件名),那么您可以使用nargs参数来执行此操作:

parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()

if args.filename is not None:
    print('The file name is {}'.format(args.filename))
else:
    print('Oh well ; No args, no problems')
Run Code Online (Sandbox Code Playgroud)