kwargs的字符串转换为kwargs

4

我有一个字符串,类似于

s = "title='bah' name='john and jill' purple='haze' none=None i=1"

我正在寻找一种Pythonic方式将其放入字典中(并且不会因额外的空格而出现错误)。有什么建议吗?

如果一个键/值中包含"="字符,您可能会遇到问题。 - John La Rooy
它不会……我有控制人们使用什么。 - Nix
3
如果你拥有“完全控制权”,那么你可以执行eval("dict(%s)" % s.replace(' ',',') ),但是不要告诉任何人我告诉过你。 - Doboy
如果您拥有完全的控制权,您会生成类似于JSON的东西,而不是尝试解析它。 - chepner
6个回答

7
>>> from ast import literal_eval
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> dict((k, literal_eval(v)) for k, v in (pair.split('=') for pair in s.split()))
{'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}

(如果内部字符串包含空格,或者 "=" 作为除了键值分隔符以外的任何内容出现,这种方法就行不通。显然,此方法变得越复杂,解析就越困难,因此...)

嘿,Nix,这是正确的做法。非常简单。 - ericraio
无法导入AST,这是Python 2.5。 - Nix

5
如果您有控制字符串的权利,就像您所说的那样,您可以简单地这样做。
>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> eval("dict(%s)"%s.replace(" ",","))
{'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
>>> 

需要注意的是,这将更改带有空格的参数(例如 "title='foo bar' name='john'" 将变为 {'name': 'john', 'title': 'foo,bar'})。 - yak
如果您可以控制字符串,应该生成类似JSON的内容。 - chepner

2
>>> dictionary = {}
>>> for i in s.split():
...     dictionary[i.split('=')[0]] = i.split('=')[1]
...
>>> dictionary
{'purple': "'haze'", 'i': '1', 'none': 'None', 'name': "'john'", 'title': "'bah'"}

0

看起来@Nix在之前的答案中错过了split()的调用。

这是已经更正的代码:

>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> d = eval("dict(%s)" % ','.join(s.split()))
>>> d
{'i': 1, 'purple': 'haze', 'none': None, 'name': 'john', 'title': 'bah'}
>>>

原始代码:

s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s))

会产生以下错误:

>>> s = "title='bah' name='john' purple='haze' none=None i=1"
>>> d = eval("dict(%s)"% ",".join(s))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    dict(t,i,t,l,e,=,',b,a,h,', ,n,a,m,e,=,',j,o,h,n,', ,p,u,r,p,l,e,=,',h,a,z,e,', ,n,o,n,e,=,N,o,n,e, ,i,=,1)
                   ^
SyntaxError: invalid syntax

这应该作为原始答案的注释或编辑留下。 - jhpratt

0
from operator import methodcaller
from ast import literal_eval
kv_split = methodcaller('split', '=', 1)
{k: literal_eval(v) for k, v in map(kv_split, s.split(" "))}
# {'purple': 'haze', 'i': 1, 'none': None, 'name': 'john', 'title': 'bah'}

-1
一个由@gnibblers和@RanRag组合而成的程序,不会在空格处出错。(例如:title='foo bar')
s = "title='bah' name='john' purple='haze' none=None i=1"
d = eval("dict(%s)"% ",".join(s.split()))

1
我喜欢匿名的负面评价。有人能解释一下为什么吗,这样我就可以修复了吗? - Nix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接