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

2024-05-17 19:45:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我能用isset安全检查吗?

像这样的:

if(isset(args.myArg)):
    #do something
else:
    #do something else

对于float/int/string类型的参数,这是否也同样有效?

我可以设置一个默认参数并检查它(例如,设置myArg=-1,或“”作为字符串,或“NOT_set”)。但是,我最终想要使用的值只在脚本的后面计算。所以我会将它设置为-1作为默认值,然后稍后将其更新为其他值。与简单地检查该值是否由用户设置相比,这似乎有点笨拙。


Tags: 字符串类型参数stringif检查用户argparseargs
3条回答

我认为使用选项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))

用法:

$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
未提供参数:
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False

我认为,如果没有提供可选参数(用--指定),则将其初始化为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

正如@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'

在内部,parser保存一个seen_actions列表,并将其用于“必需”和“互斥”测试。但它在parse_args之外是不可用的。

相关问题 更多 >