解除引用数据库支持的树时的语法

时间:2011-08-24 16:01:08

标签: coding-style mongodb python

我正在使用MongoDB,因此我的数据集群在字典中。其中一些包含对其他Mongo对象的引用。例如,假设我有一个Person文档,其中有一个单独的雇主文档。我想控制元素访问,所以我可以自动解除引用文档。我也有一些日期数据,由于PyMongo无法存储时区信息,我想在UTC时间旁边存储一个字符串时区,并且可以轻松访问转换时间。

这些选项中哪一个最适合您?

Person = {'employer': ObjectID}
Employer = {'name': str}

选项1:增强操作是方法

  • 实例
    • print person.get_employer()['name']
    • person.get_employer()['name'] = 'Foo'
    • person.set_employer(new_employer)
  • Pro:方法语法清楚地表明获得雇主不仅仅是字典访问
  • Con:引用对象之间的语法之间的差异,如果需要,很难对模式进行规范化。增加元素需要更改调用者

选项2:一切都是属性

  • 实例
    • print person.employer.name
    • person.employer.name = 'Foo'
    • person.employer = new_employer
  • Pro:增强和非增强的统一语法
  • ?:不清楚这是否由字典支持,但提供了一层抽象?
  • Con:需要将字典变形为对象,而不是pythonic吗?

选项3:一切都是字典项目

  • 实例
    • print person['employer']['name']
    • person['employer']['name'] = 'Foo'
    • person['employer'] = new_employer
  • Pro:增强和非增强的统一语法
  • ?:不清楚其中一些访问实际上是方法调用,但提供了一层抽象?
  • Con:字典项语法容易出现类型恕我直言。

2 个答案:

答案 0 :(得分:0)

您的前两个选项需要创建“人员”类和“雇主”类,并使用__dict__读取值和setattr来写入值。这种方法会更慢,但会更灵活(您可以添加新方法,验证等)。

最简单的方法是只使用字典(选项3)。它不需要任何oop。就个人而言,我也发现它是3中最具可读性的。

所以,如果我是你,我会使用选项3.这很简单,如果你改变主意,也很容易扩展。如果我必须在前两个之间做出选择,我会选择第二个(我不喜欢过度使用吸气剂和制定者)。

P.S。无论你做什么,我都会远离person.get_employer()['name'] = 'Foo'

答案 1 :(得分:0)

不要害怕编写自定义类,这会使后续代码更容易编写/读取/调试/等。

当您调用缓慢/密集/无论什么时,选项1都很好 - 并且您希望保存结果,因此可以使用选项2进行后续访问..

选项2是你最好的选择 - 减少打字,更容易阅读,创建你的课程然后实例化你离开(不需要变形字典)。

选项3并没有真正购买任何东西超过选项2(除了更多的打字,加上允许拼写错误而不是错误输出)