[英]python argparse: how to use other parsed argument as parameter at calling function in type keyword?
我正在嘗試使用argparse模塊創建用戶界面。
其中一個參數需要轉換,因此我使用type關鍵字:
add_argument('positional', ..., type=myfunction)
還有另一個可選參數:
add_argument('-s', dest='switch', ...)
另外,我有
parsed_argument=parse_args()
但是,在myfunction
,希望我可以使用一個附加參數來控制行為,這是上面的可選參數,即
def myfunction(positional, switch=parsed_argument.switch):
...
我該如何實現?
簡單答案:不能。 參數是單獨解析的,並不能真正保證維持某些順序。 無需將邏輯放入參數類型,只需將其存儲為字符串,然后在解析命令行后執行操作即可:
parser.add_argument('positional')
parser.add_argument('-s', '--switch')
args = parser.parse_args()
myfunction(args.positional, switch=args.switch)
我不確定我是否正確理解您要實現的目標,但是如果您要完成的目標是:
myprog.py cmd1 --switcha
myprog.py cmd2 --switchb
是的,您可以,您需要使用子解析器。 我為通過POI訪問stackoverflow的API編寫的一些PoC編寫了一個很好的示例。 整個邏輯在這里要花很長時間,但是主要的想法是:
parser = argparse.ArgumentParser(...)
創建解析器 subparsers = parser.add_subparsers(...)
創建子subparsers = parser.add_subparsers(...)
mycmd_fn
將args
作為參數,在該參數中,您可以對命令發出所有開關! 與您要求的不同之處在於,每個命令將需要一個函數,而不是將positional
參數作為第一個參數的一個函數。 但是您可以通過使mycmd_fn像這樣輕松地利用它: mycmd_fn = lambda *args: myfunction('mycmd', *args)
HTH
從文檔中:
type =可以接受帶有單個字符串參數並返回轉換后值的任何可調用項:
像int
和float
這樣的Python函數就是類型函數的一個很好的例子。 int
接受一個字符串並返回一個數字。 如果無法轉換字符串,則會引發ValueError
。 您的功能可以執行相同的操作。 argparse.ArgumentTypeError
是另一個選項。 argparse
不會將任何可選參數傳遞給它。 查看argparse.FileType
的代碼,以查看自定義type
詳細示例。
action
是您可以自定義行為的另一個地方。 該文檔提供了一個自定義操作的示例。 它的參數包括namespace
,解析器將在其中收集它將返回給您的值的對象。 該對象包含任何已設置的參數。 理論上,您的switch
值將在那里可用-如果它首先出現。
有許多SO答案可提供自定義Actions
。
子解析器是自定義參數處理的另一種好方法。
通常,最好檢查parse_args
之后參數的交互。 在您的情況下,“切換”可能會在位置之后發生,並且仍然有效。 argparse.Error
允許您使用argparse
錯誤機制(例如,顯示用法)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.