2013-11-28 47 views
6

我可以將字符串轉換爲python中的參數列表嗎?python將字符串轉換爲參數列表

def func(**args): 
    for a in args: 
     print a, args[a] 

func(a=2, b=3) 

# I want the following work like above code 
s='a=2, b=3' 
func(s) 

我知道:

列表可以,只需要使用*名單,但名單不能有這樣一個元素:A = 2

和eval只能評估表達

這會像:

def func2(*args): 
    for a in args: 
     print a 

list1=[1,2,3] 
func2(*list1) 
func2(*eval('1,2,3')) 
+0

像[argparse](http://docs.python.org/dev/library/argparse.html#argparse.ArgumentParser.parse_args)應該這樣做。看看如何用參數調用'parse_args()'。 –

回答

8

你可以將輸入字符串按摩到一個字典中,然後用它來調用你的函數。

>>> x='a=2, b=3' 
>>> args = dict(e.split('=') for e in x.split(', ')) 
>>> f(**args) 
a 2 
b 3 
+0

首先看到這種語法。謝謝。我不知道爲什麼'x.split(',')'中的元組(e.split('='))會導致語法錯誤,是不是dict()的參數?有關於這個規則的解釋嗎? –

+0

@AylwynLake:它是一個[生成器表達式](http://www.python.org/dev/peps/pep-0289/),它又是[list comprehensions](http:// docs。 python.org/2/tutorial/datastructures.html#list-comprehensions)。 –

7

你想要一個字典,而不是「參數列表」。

from ast import literal_eval 

params = "{'a': 2, 'b': 3}" 
func(**literal_eval(params)) 

之前,你走這條路線,確保你已經探索其他選項第一編組的選項,如​​的命令行選項:您也將使用ast.literal_eval()評估只是 Python的文字會更好,或者用於網絡或基於文件的傳輸或持久性的JSON。

+1

+1,但這種解決方案可能不適用於'a = 2,b = 3'字符串是用戶輸入(例如來自配置文件等)的情況。你寧願不允許評估任意Python代碼。 : - } –

+0

@FrerichRaabe:OP似乎在這裏查找'args'(1,2,3)''和'func2(* literal_eval(args))'的等價物;例如這將產生適用於調用的正確的python結構。 –

+0

@MartijnPieters:我的意思是Frerich Raabe說的。我想從表格的配置文件讀取,然後使用sqlalchemy自動生成表格。當處理列('id',Integer,primary_key = True)時。然後問這個問題。 –

0

您可以使用字符串作爲參數列表直接在調用eval,例如

def func(**args): 
for a in args: 
    print(a, args[a]) 

s='a=2, b=3' 

eval('func(' + s + ')') 
>>>b 3 
>>>a 2 

注意func需求是在命名空間中的eval調用這樣的工作。