2013-11-28 21 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调用这样的工作。