在Python中从字典创建或分配变量

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

但是,以这种方式修改符号表是非常不寻常的,而且可能不是一种方式。也许你需要改变你的设计,这样你就可以使用mydict字典而不是实际变量。


比赛进行得太晚了,但我确实需要这样做,我的解决方案是:

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()。

但它会污染您的全局命名空间。所以这个技巧甚至比本地人()更不干净。


您还可以在循环中使用exec关键字。

1
2
3
d = dict(param='hello', param2=500, param3=[1,2,3])
for k, v in d.iteritems():
    exec '%s = v' % k

但这确实让人感觉不太舒服。exec感觉有点深奥,您应该重新构造代码,这样就不必这样做了。