簡體   English   中英

python argparse:如何在類型關鍵字中調用函數時使用其他已解析的參數作為參數?

[英]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編寫了一個很好的示例。 整個邏輯在這里要花很長時間,但是主要的想法是:

  1. 使用parser = argparse.ArgumentParser(...)創建解析器
  2. 使用subparsers = parser.add_subparsers(...)創建子subparsers = parser.add_subparsers(...)
  3. 添加帶有諸如subparser.add_parser('mycommand',help ='Its only a command')之類的命令。set_defaults(func = mycmd_fn)其中
  4. mycmd_fnargs作為參數,在該參數中,您可以對命令發出所有開關!

與您要求的不同之處在於,每個命令將需要一個函數,而不是將positional參數作為第一個參數的一個函數。 但是您可以通過使mycmd_fn像這樣輕松地利用它: mycmd_fn = lambda *args: myfunction('mycmd', *args)

HTH

從文檔中:

type =可以接受帶有單個字符串參數並返回轉換后值的任何可調用項:

intfloat這樣的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM