[英]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:
與 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.