2017-09-05 145 views
0

所以我有一个脚本,在这个脚本中我的参数解析函数被分离出来以用于更简洁的设计。最终,我希望运行一个命令,并让这3个函数解析所有参数。该命令如下所示:通过ArgumentParser传递额外的参数

python3 rhize_refactored.py -l <str>, -sa, [-cr], -si <int>, -i <input_path>, -o <output_path>, [-r], [-c]

为了被认可的所有参数,我已经设置了脚本,以便第一参数解析函数忽略任何额外的参数得到传递给第二个参数解析函数,并再次使用第三个参数解析函数。该部分看起来像这样:

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], type=str, default='bash') #required 

    args, extras1= parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args 
    return extras1 

def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('-sa', action='store_true') #required 
    parser=parser.add_argument('-cr', action='store_true') #optional 
    parser=parser.add_argument('-si', type=int) #required 
    parser=parser.add_argument('-i') #required 
    parser=parser.add_argument('-o') #required 

    args=parser.parse_args(argv =extras1) 
    extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args 
    return extras2 

def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') #optional 
    parser.add_argument('-c', action= 'store_true') #optional 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(): 
    args, extras1= parse_args_language() 
    parse_args_bash(extras1) 
    make_templates() 
    .... 

def make_templates(): 
    args, extras2= parse_args_bash() 
    parse_args_repo(extras2) 
    ... 

def main(): 
    language= parse_args_language() 
    if language == "bash": 
     rhize_bash() 
    if language == "python": 
     rhize_python() #omitted from this post 

    print("Completed the run.") 
main() 

我是否设置了正确的方法?因为当我尝试运行完整的脚本时,它似乎完全运行,即使我知道它不应该。

+0

您忘记了调用这3个函数的代码,尽管我可以猜测它的功能。通过'充分运行'这是否意味着它最终调用所有3?这听起来很正常,除非你检查是否有任何'extras'列表是空的。 – hpaulj

+0

是的,对不起。其余的代码非常冗长和复杂,所以我不想在这里发布它。但是,是的,我在main()部分的最后有一个print语句来查看它是否完全运行(包括调用这3个函数),并且无论在我的命令行中包含多少个参数,不应该是这样。 – claudiadast

+0

你不必提供完整的代码,但是函数本身并没有告诉我们有关它们被调用的方式,或者你如何决定调用哪些函数。其实你的函数缺少重要的东西 - 返回语句(或参数和额外)。 – hpaulj

回答

0

这是试图使代码正确流动。我没有测试过它。

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], default='bash') 

    args, extras1 = parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args, extras1 # return a tuple of items 


def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('--sa', action='store_true') 
    # store_true actions are always optional 
    parser=parser.add_argument('--cr', action='store_true') 
    parser=parser.add_argument('--si', type=int) 
    parser=parser.add_argument('-i') 
    parser=parser.add_argument('-o') 

    args, extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args, extras2 


def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') 
    parser.add_argument('-c', action= 'store_true') 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(extras1): 
    args1, extras2 = parse_args_bash(extras1) 
    make_templates(extras2) 
    .... 

def make_templates(extras2): 
    args2 = parse_args_repo(extras2) 
    ... 

def main(): 
    args, extras1 = parse_args_language() 
    if args.language == "bash": 
     rhize_bash(extras1) 
    elif args.language == "python": 
     rhize_python(extras1) #omitted from this post 

    print("Completed the run.") 

if __name__ == "__main__": 
    main() 

parse_args_bashparse_args_repo回报独立args命名空间中的对象。我们可以通过argsparse_args_repo,并让它的值增加到那个值。但现在我会跳过这一步。

您的代码被称为parse_args_language几次,一次获得args.language的值,并且一次获得extras1传递。这样做没有任何伤害,但重写它,所以它只被称为一次。

由于它使用parse_known_argsparse_args_bash应该工作使用默认sys.argv,因为它只是忽略-l说法。但它也可以与extras一起去除。