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

问题描述 投票:16回答:7

我曾经想在这里正常提问,但是没有人理解我想问的问题。所以我在PHP中找到了一个例子。

// $_POST = array('address' => '123', 'name' => 'John Doe');
extract($_POST);
echo $address;
echo $name

PYTHON中有没有类似extract()的函数?

那么字典也是一样的。

mydict = {'raw':'data', 'code': 500}
// some magic to extract raw and code as vars
print raw 

p.s. 我为什么要这样做:当你在类方法中,当字符串是self.data['raw']['code']时,在join()和format()中对字符串进行6次操作是非常困难的(这里假设是dict中的dict)。

python variables extract
7个回答
25
投票

你可以使用 locals() 函数来访问本地符号表并更新该表。

>>> mydict = {'raw': 'data', 'code': 500}
>>> locals().update(mydict)
>>> raw
'data'
>>> code
500

但这样修改符号表是很不寻常的,也可能不是办法。也许你需要改变你的设计,以便你可以使用 mydict 字典而不是实际的变量。


10
投票

虽然很晚了,但我正是需要这个,我的解决方案是。

mydict = {'raw':'data', 'code': 500}
raw, code = [mydict.get(k) for k in ['raw','code']]

这样一来,就可以明确地读取变量,而且不会对locals()造成潜在的破坏 (这是我宁愿避免的一种魔法).


4
投票

好了,php兄弟们,这里有个坏消息,python不能像php那样从空间中创建变量...。${$var} . 使用local()是一个非常糟糕的主意,因为你会有大量的调试问题,而且那里已经定义了一些locals......所以这是非常糟糕的事情......。

你不能像php那样用编程的方式来创建这个。我觉得这叫非explicity,这是一个python通用的。你 总是 知道变量名。这种东西在某些情况下简直就是自杀,你需要手写大量的变量... 主要是我不高兴,因为像XML解析的事情,但它似乎有方法如何转换python字典到类,我昨天被告知这个,但仍然没有检查它是如何工作的(类似的东西 此处 )


2
投票

我建议创建一个类来存放你要创建的变量。 Alex Martelli的著名的 菜谱 几乎可以得到你所要求的所有便利,而不需要修改本地的符号表(这一点在 文件 特别警告不要这样做)。)


2
投票

这里并没有什么新的内容,只是整合了一个答案,并说明了@John Y在这里的意思。他的回答:

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

1
投票

我尝试了 @Frédéric Hamidi 的答案,发现 locals() 只在主脚本中工作,在任何函数中都不工作。所以我搜索了一下,发现locals()是只读的。之所以在主脚本中有效,可能是因为 locals()和 globals()是一样的,而 globals()是可以修改的。

所以我建议使用 globals().update()来代替。

但它会污染你的全局命名空间。所以这招比locals()更不干净。


0
投票

你也可以使用 exec 循环中的关键词。

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

但这肯定会让人觉得不规范。exec 感觉有点深奥,你可能应该直接重组你的代码,这样你就不必这样做了。

© www.soinside.com 2019 - 2024. All rights reserved.