首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python嵌套数据持久化

Python嵌套数据持久化
EN

Stack Overflow用户
提问于 2011-05-06 10:37:43
回答 2查看 174关注 0票数 1

我需要一种存储系统配置数据的方法,并且我发现使用嵌套类很容易理解/理解:

代码语言:javascript
复制
>>> 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
>>> 

但是这个结构不能被修改和保存。我知道我可以把它放在键/值对中:

代码语言:javascript
复制
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读起来很容易交叉编译等等)

你用了什么灵活和直接的东西?它不需要高性能,并发会很好,但不是“必需的”。

我从来没有做过这样的事情,希望你们有一些见解/经验想要分享!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-06 11:07:22

我同意Ignacio Vazquez-艾布拉姆斯的观点,使用类似JSON的结构将使其更容易使用,这意味着您可能会有如下结构:

代码语言:javascript
复制
syscnf = {
  'netwrk': {
    'iface': {
       'eth0': {
          'address': '192.168.0.100',
          'netmask': '255.255.255.0',
          'mtu': 1500,
        }
        # ...
     }
     'route': {
        'default': '192.168.0.1',
     }
  }
}

也就是说,主要是字典中的字典(以及字符串、数字和列表等其他值)。然后你需要访问像字典这样的元素,而不是类,例如,

代码语言:javascript
复制
print syscnf['netwrk']['iface']['eth0']['address']

而不是:

代码语言:javascript
复制
print syscnf.netwrk.iface.eth0.address

然后,您可以只使用json或simplejson模块(或者甚至是很好的旧的pickle/cPickle)来序列化。

当然,你确实失去了一些漂亮的东西,却得到了一堆括号。如果这对你来说很重要,那么你可以尝试像YAML (Python模块可用)这样的东西,或者你可以保留现有的东西,手写一个转换器,递归地用字典替换类,用它的dir()的成员为键的字典,删除像文档模块这样的东西。

例如,

代码语言:javascript
复制
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的结构:

代码语言:javascript
复制
>>> 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对象并以您喜欢的方式访问它,您可以颠倒这个过程:

代码语言:javascript
复制
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

例如:

代码语言:javascript
复制
>>> 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
票数 3
EN

Stack Overflow用户

发布于 2011-05-06 10:41:05

所有酷孩子都用json。此外,让您的结构使用实例而不是裸类将使其更容易序列化。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5906225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档