Coding style 取消引用数据库支持的树时的语法
我使用的是MongoDB,所以我的数据集群在字典中。其中一些包含对其他Mongo对象的引用。例如,假设我有一份个人文件,其中有一份单独的雇主文件。我想控制元素访问,以便自动取消引用文档。我也有一些日期数据,因为PyMongo不能存储时区信息,所以我想在UTC时间旁边存储一个字符串时区,并且可以方便地访问转换后的时间 以下哪个选项对您来说是最好的Coding style 取消引用数据库支持的树时的语法,coding-style,mongodb,python,Coding Style,Mongodb,Python,我使用的是MongoDB,所以我的数据集群在字典中。其中一些包含对其他Mongo对象的引用。例如,假设我有一份个人文件,其中有一份单独的雇主文件。我想控制元素访问,以便自动取消引用文档。我也有一些日期数据,因为PyMongo不能存储时区信息,所以我想在UTC时间旁边存储一个字符串时区,并且可以方便地访问转换后的时间 以下哪个选项对您来说是最好的 Person = {'employer': ObjectID} Employer = {'name': str} 选项1:增强操作是一种方法 例子
Person = {'employer': ObjectID}
Employer = {'name': str}
选项1:增强操作是一种方法
- 例子
print person.get_employer()['name']
person.get_employer()['name']='Foo'
person.set\u雇主(新雇主)
- 赞成:方法语法清楚地表明,获得雇主不仅仅是字典访问
- 缺点:引用对象和非引用对象之间的语法不同,这使得在必要时很难规范化模式。扩充元素需要更改调用者
- 例子
打印人员.雇主.姓名
person.employer.name='Foo'
person.employer=新雇主
- Pro:增广和非增广的统一语法
- ?:不清楚这是否有词典支持,但提供了一个抽象层
- 缺点:需要将字典变形为对象,而不是pythonic
- 例子
打印人员['employer']['name']
person['employer']['name']='Foo'
person['employer']=新雇主
- Pro:增广和非增广的统一语法
- ?:不清楚其中一些访问实际上是方法调用,但提供了一个抽象层
- 缺点:字典项语法容易出错,输入IMHO李>
\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给你买任何东西(除了更多的打字,再加上允许打字错误通过而不是出错)