簡體   English   中英

將元組作為命令行參數傳遞

[英]Passing a tuple as command line argument

我的要求是將元組作為命令行參數傳遞,例如

--data (1,2,3,4)

我嘗試使用argparse模塊,但如果我像這樣傳遞,它會作為字符串'(1,2,3,4)' 我嘗試為argparse.add_argument提供type=tuple ,但在這里沒有用。

我是否必須添加一個新類型類並將其傳遞給add_argument類型參數?

更新

我根據答案嘗試了ast.literal_eval 感謝那。 但它在結果中給出了空格,如下所示。

(1,2,3,4)
<type 'str'>
(1, 2, 3, 4)
<type 'tuple'>

nargs所述的data參數nargs="+" (意思是一個或多個)和類型int ,可以再這樣設置的參數在命令行上:

--data 1 2 3 4

args.data現在將是[1, 2, 3, 4]

如果你必須有一個元組,你可以這樣做:

my_tuple = tuple(args.data)

把它們放在一起:

parser = argparse.ArgumentParser()
parser.add_argument('--data', nargs='+', type=int)
args = parser.parse_args()
my_tuple = tuple(args.data)

我有同樣的要求。 在標准包中找不到。 所以,推出了這個。 蟒蛇 3 倍。 放入簡單的 argv 解析器,一次調用一個 arg:

  • var是默認傳遞的,類型正確。
  • argval是找到命令行字符串。 逗號分隔,沒有空格。 即 1、2、3 或一、二、三。

與 bash shell 一起工作,可能需要引號,其他 shell 的其他調整,操作系統的。 相同的技術適用於非列表類型。 此版本基於 var[0] 創建同構列表或元組。

例子:

./foo.py   --mytuple 1,2,3,4,5

代碼:

def chk_arg( var, argstr, dbg=False): 
    ### loop on sys.argv here .....
    # if list/tuple type, use list comprehension
    # converts csv list to list or tuple 'type(var)' of 'type(var[0])' items. 
    if type(var) is list or type(var) is tuple:  
        val = type(var)([type(var[0])(i) for i in argval.split(',')]) 

如果你想擴展它,而不是處理語法樹,並在參數中提供元組轉換,你需要一個自定義的 argparse 類型。 (我需要這個,因為我的解析器在一個包中,我不想要求我的用戶都寫my_tuple = tuple(args.data) 。使用參數類型,您還可以像原始一樣接收帶括號的字符串問題。另外,我不會包括nargs ,因為這會將您的自定義類型輸出包裝到一個列表中,這基本上違背了您的自定義類型的目的。我映射了一個浮點數,因為我的輸入類似於“0.9, 0.99”,但是你的 int 工作原理相同:

def tuple_type(strings):
    strings = strings.replace("(", "").replace(")", "")
    mapped_int = map(int, strings.split(","))
    return tuple(mapped_int)

parser = argparse.ArgumentParser()
parser.add_argument('--data', type=tuple_type)
args = parser.parse_args()

這樣你就可以發送--data "(1,2,3,4)"--data "1,2,3,4"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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