Coding style 取消引用数据库支持的树时的语法

Coding style 取消引用数据库支持的树时的语法,coding-style,mongodb,python,Coding Style,Mongodb,Python,我使用的是MongoDB,所以我的数据集群在字典中。其中一些包含对其他Mongo对象的引用。例如,假设我有一份个人文件,其中有一份单独的雇主文件。我想控制元素访问,以便自动取消引用文档。我也有一些日期数据,因为PyMongo不能存储时区信息,所以我想在UTC时间旁边存储一个字符串时区,并且可以方便地访问转换后的时间 以下哪个选项对您来说是最好的 Person = {'employer': ObjectID} Employer = {'name': str} 选项1:增强操作是一种方法 例子

我使用的是MongoDB,所以我的数据集群在字典中。其中一些包含对其他Mongo对象的引用。例如,假设我有一份个人文件,其中有一份单独的雇主文件。我想控制元素访问,以便自动取消引用文档。我也有一些日期数据,因为PyMongo不能存储时区信息,所以我想在UTC时间旁边存储一个字符串时区,并且可以方便地访问转换后的时间

以下哪个选项对您来说是最好的

Person = {'employer': ObjectID}
Employer = {'name': str}
选项1:增强操作是一种方法

  • 例子
    • print person.get_employer()['name']
    • person.get_employer()['name']='Foo'
    • person.set\u雇主(新雇主)
  • 赞成:方法语法清楚地表明,获得雇主不仅仅是字典访问
  • 缺点:引用对象和非引用对象之间的语法不同,这使得在必要时很难规范化模式。扩充元素需要更改调用者
选项2:一切都是一个属性

  • 例子
    • 打印人员.雇主.姓名
    • person.employer.name='Foo'
    • person.employer=新雇主
  • Pro:增广和非增广的统一语法
  • ?:不清楚这是否有词典支持,但提供了一个抽象层
  • 缺点:需要将字典变形为对象,而不是pythonic
选项3:所有内容都是字典项

  • 例子
    • 打印人员['employer']['name']
    • person['employer']['name']='Foo'
    • person['employer']=新雇主
  • Pro:增广和非增广的统一语法
  • ?:不清楚其中一些访问实际上是方法调用,但提供了一个抽象层
  • 缺点:字典项语法容易出错,输入IMHO
您的前两个选项需要创建一个“Person”类和一个“Employer”类,并使用
\uuuu dict\uuuu
读取值和
setattr
写入值。这种方法会更慢,但会更灵活(您可以添加新方法、验证等)

最简单的方法是只使用字典(选项3)。它不需要任何面向对象的需求。就我个人而言,我也觉得它是3本书中最具可读性的一本

所以,如果我是你,我会使用选项3。它很好,很简单,如果你改变主意,以后很容易扩展。如果我必须在前两种之间做出选择,我会选择第二种(我不喜欢过度使用getter和setter)


另外,我会远离person.get_employer()['name']='Foo',不管你做什么。

你的前两个选项将需要创建一个“person”类和一个“employer”类,并使用
\uu dict\uuuuuuuuu
读取值和
setattr
写入值。这种方法会更慢,但会更灵活(您可以添加新方法、验证等)

最简单的方法是只使用字典(选项3)。它不需要任何面向对象的需求。就我个人而言,我也觉得它是3本书中最具可读性的一本

所以,如果我是你,我会使用选项3。它很好,很简单,如果你改变主意,以后很容易扩展。如果我必须在前两种之间做出选择,我会选择第二种(我不喜欢过度使用getter和setter)


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

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

当您调用缓慢/密集/任何内容时,选项1都很好——您希望保存结果,以便可以使用选项2进行后续访问

选项2是你最好的选择——更少的输入,更容易阅读,创建类一次,然后实例化,然后离开(不需要修改字典)


选项3并不比选项2为您带来任何好处(除了更多的输入,再加上允许输入错误传递而不是出错)

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

当您调用缓慢/密集/任何内容时,选项1都很好——您希望保存结果,以便可以使用选项2进行后续访问

选项2是你最好的选择——更少的输入,更容易阅读,创建类一次,然后实例化,然后离开(不需要修改字典)

选项3并不比选项2给你买任何东西(除了更多的打字,再加上允许打字错误通过而不是出错)