所以我有一個腳本,在這個腳本中我的參數解析函數被分離出來以用於更簡潔的設計。最終,我希望運行一個命令,並讓這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()
我是否設置了正確的方法?因爲當我嘗試運行完整的腳本時,它似乎完全運行,即使我知道它不應該。
您忘記了調用這3個函數的代碼,儘管我可以猜測它的功能。通過'充分運行'這是否意味着它最終調用所有3?這聽起來很正常,除非你檢查是否有任何'extras'列表是空的。 – hpaulj
是的,對不起。其餘的代碼非常冗長和複雜,所以我不想在這裏發佈它。但是,是的,我在main()部分的最後有一個print語句來查看它是否完全運行(包括調用這3個函數),並且無論在我的命令行中包含多少個參數,不應該是這樣。 – claudiadast
你不必提供完整的代碼,但是函數本身並沒有告訴我們有關它們被調用的方式,或者你如何決定調用哪些函數。其實你的函數缺少重要的東西 - 返回語句(或參數和額外)。 – hpaulj