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

我想检查一个可选的argparse参数是否已经被用户设置。

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

像这样的东西:

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

这对float / int / stringtypes的参数是否一样?

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

我认为可选参数(用--指定)初始化为None如果它们没有提供。 所以你可以用is not None来testing。 试试下面的例子:

 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是一个很好的testing。 这是默认的默认default ,用户不能给你一个重复的string。

你可以指定另一个default='mydefaultvalue ,并testing。 但是,如果用户指定string呢? 这算不算是设定?

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

 args.foo # raises an AttributeError hasattr(args, 'foo') # returns False getattr(args, 'foo', 'other') # returns 'other' 

parser在内部保存一个seen_actions列表,并将其用于'必需'和'互斥'testing。 但是它在parse_args外面是不可用的。

如果你的参数是位置的 (即它没有“ – ”或“ – ”前缀,只是参数,通常是一个文件名),那么你可以使用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') 

这是我的解决scheme,看看我是否使用argparsevariables

 import argparse ap = argparse.ArgumentParser() ap.add_argument("-1", "--first", required=True) ap.add_argument("-2", "--second", required=True) ap.add_argument("-3", "--third", required=False) # Combine all arguments into a list called args args = vars(ap.parse_args() if args["third"] is not None: # do something 

这可能会让我更深入地了解上面的答案,这些答案被用于我的程序。

您可以使用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) 

这样,你不必担心通过条件检查is not None 。 你只要检查是或False 。 请阅读文档中有关这些选项的更多信息