如何正确定义复杂的数据结构?

时间:2017-05-16 19:24:46

标签: python design-patterns data-structures

我想在Python中定义一个数据结构,我可以使用它轻松编写加载程序和转储程序(与各种序列化格式之间)。它应该提供:

  • 通过直接属性轻松访问内容
  • 根据定义的架构验证内容的可能性
  • 撰写代表和装载者

为了说明这个问题,请考虑以下数据:

data = {
   'location_a': [{
      'name': 'Library A',
      'city: 'London',
      'books': [
         {'title': 'foo', 'date': '2010-04', pages: 400},
      }]
   ]
}

这是限制较少的解决方案,因为没有类型或内容验证。

另一种解决方案是定义这样的类:

class Book(DataContainer):
   _fields_ = [('title', str), ('date', str), ('pages', int)]

class Library(DataContainer):
   _fields_ = [('name', str), ('city', str), ('books', ListOf(Book))]

class Place(DataContainer):
   _fields_ = [{('location', str): ListOf(Library)}]

b = Book(title='foo', date='2010-04', 'pages':400)

l = Library()
l.name = 'Library A'
l.city = 'London'
l.books.append(b)

p = Place(location='location_a')
p.append(l)

data = Data()
data.append(p)

print data.to_xml()

data['location_a'][0].books.append(Book(title='bar'))

dictionary = data.to_dict()

这当然是一个非常丑陋的例子,但我正在寻找一个干净的模块化解决方案,我可以轻松地创建代表,加载器甚至验证器:

Book.title.add_constraint(Match(r'[a-z0-9_]+'))

是否有任何常见模式或已知模块提供此类功能?

例如我尝试过Pandas,但它更专注于数据分析,并且不支持空字段。 '浮动'只允许'NaN'。 Voluptuous是一个很好的验证模块,但它必须用于更完整的解决方案。

有什么想法吗?

0 个答案:

没有答案