2014-12-10 74 views
6

其他参数我要完成这样的事情:参数依赖于与Argparse

-LoadFiles 
    -SourceFile "" -DestPath "" 
    -SourceFolder "" -DestPath "" 
-GenericOperation 
    -SpecificOperation -Arga "" -Argb "" 
    -OtherOperation -Argc "" -Argb "" -Argc "" 

用户应该能够运行的东西,如:

-LoadFiles -SourceFile“somePath” -DestPath “somePath”

-LoadFiles -SourceFolder “somePath” -DestPath “somePath”

基本上,如果您有-LoadFiles,则需要在之后具有-SourceFile或-SourceFolder。如果您有-SourceFile,则需要具有-DestPath等。

此链条是否可以用于其他参数所需的参数?如果没有,我至少可以做些什么,如果你有-SourceFile,你必须有-DestPath?

+1

http://bugs.python.org/issue11588探讨增加一般相互依赖的测试方式,但直到被实现,最好的办法是做自己的测试,解析后。 – hpaulj 2014-12-10 22:39:54

回答

5

您对您所创建的ArgumentParser实例调用parse_args后,它会给你一个Namespace对象。只要检查其中一个参数是否存在,那么另一个参数也必须存在。像:

args = parser.parse_args() 
if ('LoadFiles' in vars(args) and 
    'SourceFolder' not in vars(args) and 
    'SourceFile' not in vars(args)): 

    parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile') 
0

这里是一个示例,如果您指定--makeDependency,则会强制您指定--dependency和一个值。

这不是由argparse单独完成,而是由稍后验证用户指定内容的程序完成。

#!/usr/bin/env python 
import argparse 
import sys 

parser = argparse.ArgumentParser() 
parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true') 
parser.add_argument('--dependency', help='dependency example') 

args = parser.parse_args() 

if args.makeDependency and not args.dependency: 
    print "error on dependency" 
    sys.exit(1) 

print "ok!"