什么是数据对象可接受的样式python

pm1*_*100 5 python

python中数据对象的普通样式是什么。可以说我有一种方法可以从某个地方(网络,数据库等)获取客户,我应该返回哪种类型的对象。我看到几种选择:

  • 一个元组
  • 一本字典
  • 一个类实例(数据类为“普通”类)

我敢肯定还有其他人。做我的第一个大型python项目,因此想从一开始就使用最佳实践

哇-对这个问题的负面反应感到惊讶。也许不清楚

我有很多要传递给我的代码的不同数据项。用户,产品,客户,订单等(实际上,它们并非如此,而是简单易懂的事物类型)。所以我有

def get_user():
  return x
Run Code Online (Sandbox Code Playgroud)

x应该是什么。类的实例,称为用户,字典,元组...

没有与对象关联的方法,纯数据

似乎namedtuple是要走的路

编辑:如何作为一种样式

class product:
   pass

...

def get_product():
   ... db read stuff
   pr = product()
   pr.name = dbthing[0]
   pr.price = dbthing[1]
   return pr
Run Code Online (Sandbox Code Playgroud)

那是酒吧诱导或成熟的风格,还是奇怪或什么?有用。从消费者的角度来看,它使代码更加可读

def xxx():
  pr = get_product()
  total = amount * pr.price
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 2

对于简单的数据记录,您通常应该首先考虑collections.namedtuple,如果出于任何原因不适合,则使用其他选项之一。一旦您知道为什么它不适合,通常会建议使用其他哪个。您可以将其视为collections.namedtuple快速定义不可变“数据类”的快捷方式。

以数据库为例,如果您使用 ORM,那么即使是最简单的记录也会被表示为对象[*],并且有充分的理由,因为它们都有一些共同的操作,您可以对其执行一些操作,例如存储更改返回数据库。ORM 的教程/文档将为您提供指导。如果您直接使用 Python db API,那么来自 SQL 查询的行将(最初)作为元组返回,但是当然,一旦您拥有它们,您就可以对它们执行您喜欢的操作。此外,数据库连接器可以提供在调用返回execute()它们之前操作它们的方法,例如在 sqlite3 中设置行工厂。

以“网络”为例——数据交换的方式有很多种,但一个常见的例子是访问返回 JSON 数据的 API。在这种情况下,没有太多选择,只能首先在程序中以与 JSON 结构相同的方式表示这些数据:作为包含列表、字典、字符串和数字的列表和字典。再次强调,一旦你拥有它,你就可以用它做你喜欢做的事。按原样使用它是相当正常的,立即将其重组为其他东西也是相当正常的。个人喜好和具体情况都会影响您的实际选择。

您当然应该将所有这些事情视为可用的选项。一般来说,您会使用:

  • 元组,每个位置都有自己的含义。这就是为什么Python通过返回元组从函数返回“多个值”,因为不同的东西可能是完全不同的类型,具有不同的含义。
  • 当可用键因记录而异时的字典。
  • 当每条记录的键都相同时的数据类。您可以用于namedtuple不可变记录。
  • 当顺序很重要但位置都相等时的列表或元组。请注意,“元组是不可变的,列表是可变的”与“元组用于异构数据,列表用于同质数据”之间存在一些紧张关系。就我个人而言,我倾向于前者,但我已经看到了后者的合理论据,所以如果你问一般人如何做出选择,你不能忽视这一点。

[*] 嗯,元组和字典当然也是对象,我指的是这些数据结构以外的对象;-)