我想检查用户是否设置了可选的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)
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)
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
这样,您不必担心按条件检查is not None.你只需检查True或False.在此处阅读有关这些选项的更多信息
如果您的参数是位置的(即它没有" - "或" - "前缀,只是参数,通常是文件名),那么您可以使用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)