我需要一种存储系统配置数据的方法,并且我发现使用嵌套类很容易理解/理解:
>>> class syscnf:
... class netwrk:
... class iface:
... class eth0:
... address = '192.168.0.100'
... netmask = '255.255.255.0'
... mtu = 1500
... class eth1:
... address = '172.25.0.23'
... netmask = '255.255.255.128'
... class route:
... default = '192.168.0.1'
>>>
>>> print syscnf.netwrk.iface.eth0.address
192.168.0.100
>>> 但是这个结构不能被修改和保存。我知道我可以把它放在键/值对中:
syscnf.netwrk.iface.eth0.address => 192.168.0.100
syscnf.netwrk.iface.eth0.netmask => 255.255.255.0
syscnf.netwrk.route.default => 192.168.0.1
syscnf.... etc但这似乎很难管理,而且容易出错?
或者,我可以将其保存在sqlite DB中,但之后我将需要一个新的表,并且每个最后级别的配置数据的模式以及在sqlite中存储的酸洗数据似乎很难管理。
我需要一种在嵌入式平台上持久化这些数据的方法,所以它需要依赖于纯python和包含的模块(或者非常容易交叉编译-我没有尝试过,但ZODB读起来很容易交叉编译等等)
你用了什么灵活和直接的东西?它不需要高性能,并发会很好,但不是“必需的”。
我从来没有做过这样的事情,希望你们有一些见解/经验想要分享!
发布于 2011-05-06 11:07:22
我同意Ignacio Vazquez-艾布拉姆斯的观点,使用类似JSON的结构将使其更容易使用,这意味着您可能会有如下结构:
syscnf = {
'netwrk': {
'iface': {
'eth0': {
'address': '192.168.0.100',
'netmask': '255.255.255.0',
'mtu': 1500,
}
# ...
}
'route': {
'default': '192.168.0.1',
}
}
}也就是说,主要是字典中的字典(以及字符串、数字和列表等其他值)。然后你需要访问像字典这样的元素,而不是类,例如,
print syscnf['netwrk']['iface']['eth0']['address']而不是:
print syscnf.netwrk.iface.eth0.address然后,您可以只使用json或simplejson模块(或者甚至是很好的旧的pickle/cPickle)来序列化。
当然,你确实失去了一些漂亮的东西,却得到了一堆括号。如果这对你来说很重要,那么你可以尝试像YAML (Python模块可用)这样的东西,或者你可以保留现有的东西,手写一个转换器,递归地用字典替换类,用它的dir()的成员为键的字典,删除像文档和模块这样的东西。
例如,
from types import ClassType
def jsonize_class( klass ):
def recurse( child ):
return jsonize_class(child) if isinstance(child, ClassType) else child
def entry( key ):
return key, recurse( getattr(klass,key) )
return dict(( entry(key) for key in dir(klass) if not key.startswith('__') ))然后,它会将您已经使用的格式的类转换为类似json的结构:
>>> class bob:
... x = 9
... y = "hello"
... class job:
... bill = 999
... class rob:
... pass
...
>>> jsonize_class(bob)
{'y': 'hello', 'x': 9, 'job': {'bill': 999}, 'rob': {}}然后,要获取序列化的JSON对象并以您喜欢的方式访问它,您可以颠倒这个过程:
from types import DictType
def classize_json( the_json ):
if isinstance( the_json, DictType ):
class returned_class: pass
for key, val in the_json.iteritems():
setattr( returned_class, key, classize_json(val) )
return returned_class
else:
return the_json例如:
>>> jBob = jsonize_class(bob)
>>> jBob
{'y': 'hello', 'x': 9, 'job': {'bill': 999}, 'jimmy': 99, 'rob': {}}
>>> cBob = classize_json(jBob)
>>> cBob.y
'hello'
>>> cBob.job.bill
999
>>> cBob.jimmy
99发布于 2011-05-06 10:41:05
所有酷孩子都用json。此外,让您的结构使用实例而不是裸类将使其更容易序列化。
https://stackoverflow.com/questions/5906225
复制相似问题