Creating or assigning variables from a dictionary in Python
我试着在这里问一个正常的问题,但没人知道我想问什么。所以我在PHP中找到了示例。
1 2 3 4 | // $_POST = array('address' => '123', 'name' => 'John Doe'); extract($_POST); echo $address; echo $name |
在python中是否有类似extract()的函数???????
所以字典也是如此:
1 2 3 | mydict = {'raw':'data', 'code': 500} // some magic to extract raw and code as vars print raw |
另外,我为什么要这样做:当你在类方法中,当字符串是self.data时,用join()和format()中的字符串进行6次操作是非常困难的。
可以使用locals()函数访问本地符号表并更新该表:
1 2 3 4 5 6 | >>> mydict = {'raw': 'data', 'code': 500} >>> locals().update(mydict) >>> raw 'data' >>> code 500 |
但是,以这种方式修改符号表是非常不寻常的,而且可能不是一种方式。也许你需要改变你的设计,这样你就可以使用
比赛进行得太晚了,但我确实需要这样做,我的解决方案是:
1 2 | mydict = {'raw':'data', 'code': 500} raw, code = [mydict.get(k) for k in ['raw','code']] |
这样,它对于阅读是明确的,并且不会有对locals()的潜在攻击(这是一个我宁愿避免的魔法)。
好吧,php兄弟,这是个坏消息,python不能从空间外创建变量…像php一样可以:$$var。使用local()是一个非常糟糕的主意,因为调试会有很多问题,其中已经定义了一些局部变量。所以这真的是件坏事…
您不能像PHP那样以编程方式创建它。我认为它被称为非显式的,这是一个python常规:您总是知道变量名。这种东西只是自杀,在某些情况下,你需要用手写成吨的瓦尔斯…大多数时候,我不高兴是因为XML解析之类的事情,但似乎有一些方法可以将python字典转换成类,昨天有人告诉我这个,但我仍然没有检查它是如何工作的(像这里这样)。
这里没有什么新鲜的东西,只是一个anwser的合并,以及@john y在回答中的含义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | mydict = {'raw': 'data', 'code': 500} def extract(dct, namespace=None): if not namespace: namespace = globals() namespace.update(dct) extract(mydict) print raw print code class Extract: def __init__(self, dct): self.__dict__.update(dct) obj = Extract(mydict) print obj.raw print obj.code |
我建议创建一个类来保存您要创建的变量。亚历克斯·马泰利的著名菜谱几乎能为你提供你想要的所有便利,而无需修改本地符号表(医生特别警告不要这样做)。
我尝试了@fr_d_ric hamidi的答案,发现locals()只在主脚本中工作,不在任何函数中工作。所以我做了一些搜索,发现locals()是只读的。它在主脚本中工作的原因,可能是因为locals()与globals()相同,并且globals()可以修改。
所以我建议使用globals().update()。
但它会污染您的全局命名空间。所以这个技巧甚至比本地人()更不干净。
您还可以在循环中使用
1 2 3 | d = dict(param='hello', param2=500, param3=[1,2,3]) for k, v in d.iteritems(): exec '%s = v' % k |
但这确实让人感觉不太舒服。