2014-02-20 68 views
1

是否有任何庫可以在Python中的sys.argv中解析隨機鍵值對?解析未定義的參數

例如:

python run.py --v1 k1 --v2 k2 --v3 k3 

應該返回我喜歡{V1-> K1,V2-> K2,V3-> K3}一本字典。在編譯時我不知道那些'v'是什麼。

謝謝!

厄爾

+0

你打算如何使用那些你事先不知道的名字? – SingleNegationElimination

+3

我建議像'--var v1 = k1 --var v2 = k2 --var v3 = k3'這樣的東西,而不是 – jterrace

+0

在python中製作一個工具,它需要一個模板文件和一堆k-v對。類似於jinja2 –

回答

0

這是一種哈克,但你有這樣的:

import argparse 
import collections 
parser = argparse.ArgumentParser() 
known, unknown_args = parser.parse_known_args() 

unknown_options = collections.defaultdict(list) 
key = None 
for arg in unknown_args: 
    if arg.startswith('--'): 
     key = arg[2:] 
    else: 
     unknown_options[key].append(arg) 
+0

中建議的'--var name = val'語法。所以基本上這個解決方案將提問者確切地留在他開始的位置 - 需要一個庫來解析一系列意料之外的選項。它也可以很容易地優化到'unknown_args = sys.argv',因爲它就是這樣。 – lanzz

+0

哦,你是對的,這是非常糟糕的。我現在添加了更多代碼。 – wim

+0

順便說一句,sys.argv有其他的東西,像腳本名稱 – wim

0
d = {} 
for i,arg in enumerate(sys.argv): 
    if arg.startswith("--"): 
     d[arg[2:]] = sys.argv[i+1] 

print d 
+0

這個解決方案會給連續的鍵帶來意想不到的結果(例如,當用'--foo --bar --baz'參數運行時) – lanzz

+0

是的,它會......但那不是輸入OP指定。 ..如果它和他的例子一樣狹窄,那麼這將工作得很好:P ...如果他需要更多的智能......它很容易改變以滿足簡單的需求......如果他需要更先進的東西,應該使用評論 –

0

在使用字典理解,你可以使用一個襯墊這樣一個新的Python:

ll = sys.argv[1:] 
args = {k[2:]:v for k,v in zip(ll[::2], ll[1::2])} 
# {'v1': 'k1', 'v2': 'k2', 'v3': 'k3'} 

它不具有任何靈活性,以防您的用戶擰緊配對,但它會是一個快速的st藝術。

一個發生器可用於彈出sys.argv[1:]以外的字符串對。這將是建立靈活性和錯誤檢查的好地方。

def foo(ll): 
    ll = iter(ll) 
    while ll: 
     yield ll.next()[2:], ll.next() 
{k:v for k,v in foo(ll)}