检查是否设置了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_true
和store_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
。 请阅读文档中有关这些选项的更多信息