我曾经想在这里正常提问,但是没有人理解我想问的问题。所以我在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)。
你可以使用 locals() 函数来访问本地符号表并更新该表。
>>> mydict = {'raw': 'data', 'code': 500}
>>> locals().update(mydict)
>>> raw
'data'
>>> code
500
但这样修改符号表是很不寻常的,也可能不是办法。也许你需要改变你的设计,以便你可以使用 mydict
字典而不是实际的变量。
虽然很晚了,但我正是需要这个,我的解决方案是。
mydict = {'raw':'data', 'code': 500}
raw, code = [mydict.get(k) for k in ['raw','code']]
这样一来,就可以明确地读取变量,而且不会对locals()造成潜在的破坏 (这是我宁愿避免的一种魔法).
好了,php兄弟们,这里有个坏消息,python不能像php那样从空间中创建变量...。${$var} . 使用local()是一个非常糟糕的主意,因为你会有大量的调试问题,而且那里已经定义了一些locals......所以这是非常糟糕的事情......。
你不能像php那样用编程的方式来创建这个。我觉得这叫非explicity,这是一个python通用的。你 总是 知道变量名。这种东西在某些情况下简直就是自杀,你需要手写大量的变量... 主要是我不高兴,因为像XML解析的事情,但它似乎有方法如何转换python字典到类,我昨天被告知这个,但仍然没有检查它是如何工作的(类似的东西 此处 )
这里并没有什么新的内容,只是整合了一个答案,并说明了@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
我尝试了 @Frédéric Hamidi 的答案,发现 locals() 只在主脚本中工作,在任何函数中都不工作。所以我搜索了一下,发现locals()是只读的。之所以在主脚本中有效,可能是因为 locals()和 globals()是一样的,而 globals()是可以修改的。
所以我建议使用 globals().update()来代替。
但它会污染你的全局命名空间。所以这招比locals()更不干净。
你也可以使用 exec
循环中的关键词。
d = dict(param='hello', param2=500, param3=[1,2,3])
for k, v in d.iteritems():
exec '%s = v' % k
但这肯定会让人觉得不规范。exec
感觉有点深奥,你可能应该直接重组你的代码,这样你就不必这样做了。