2017-09-05 121 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一起去除。