python 一个小技巧

在python中,我们习惯用dict来配置数据,如下:

Config = {
    "version" : "1.0",
    "author" : "bravf"
}

并且以Config["version"]的方式来访问,好吧,搞Js的同学表示他太罗嗦了,Js可以Config.version,在python中这样访问会抛出异常:"'dict' object has no attribute 'version'", 看来,python中的"."运算符并不能用来访问键值对,只能访问一个类上的自有属性。那么转化一下吧:

#--------------------------------------------------------------------
# 说明:把dict形式的配置改成基于class的属性访问
# 好处:用"."运算符来访问
#--------------------------------------------------------------------
class EasyObj(object):pass
def DictToClass(_dict):
	obj = EasyObj()
	for m,n in _dict.iteritems() : setattr(obj,m,n)
	return obj
#end def

没多大的用处,只是希望能少写一些字符。

---------------------------分隔符-------------------------------------------------

好吧,上面的代码遇到这样的情况就歇菜了:

Config = {
		"version" : "1.0",
		"author"  : "bravf",
		"account" : {
			"user" : "bravf",
			"pwd" : "bravf",
			"language" : ["英语","日语"]
		},
		"a" : {
			"a_0" : "a_0",
			"a_1" : "a_1",
			"a_2" : {
				"a_2_0" : "a_2_0"
			}
		}
	}

因为没有深度遍历,加上递归搞定他:

#--------------------------------------------------------------------
# 说明:把dict形式的配置改成基于class的属性访问
# 好处:用"."运算符来访问
#--------------------------------------------------------------------
class EasyObj(object):pass
def DictToClass(_dict):
	obj = EasyObj()
	for m,n in _dict.iteritems() :
		if type(n) == type({}) : n = DictToClass(n)
		setattr(obj,m,n)
	#end for
	return obj
#end def

  

posted @ 2011-11-02 18:02 bravf 阅读(241) 评论(2) 编辑 收藏