如何决定何时引入新类型而不是使用列表或元组?

Ser*_*rge 5 python

我喜欢用python做一些愚蠢的事情,比如解决编程难题,编写小脚本等等.每次在某个时刻,我都面临着一个两难的境地,我是否应该创建一个新的类来表示我的数据,或者只是使用快速和肮脏的东西去将所有值打包在列表或元组中.由于极端的懒惰和对self关键字的个人厌恶,我通常会选择第二种选择.

我的理解比从长远来看,用户定义的数据类型是因为更好的path.min_costpoint.x, point.y比更富于表现力path[2]point[0], point[1].但是当我只需要从一个函数中返回多个东西时,它就会让我觉得太多了.

所以我的问题是,选择何时创建用户定义的数据类型以及何时使用列表或元组有什么好的经验法则?或者也许有一种我不知道的整齐的pythonic方式?

谢谢.

eca*_*mur 8

你知道collections.namedtuple吗?(自2.6起)

def getLocation(stuff):
    return collections.namedtuple('Point', 'x, y')(x, y)
Run Code Online (Sandbox Code Playgroud)

或者,更有效率,

Point = collections.namedtuple('Point', 'x, y')
def getLocation(stuff):
    return Point(x, y)
Run Code Online (Sandbox Code Playgroud)

namedtuple可以通过index(point[0])和unpacked(x, y = point)以相同的方式访问tuple,因此它提供了几乎无痛的升级路径.


sen*_*rle 2

首先,对表现力的观察。您提到担心point.xpoint.y与 的相对表现力point[0], point[1],但这是一个可以通过多种方式解决的问题。事实上,对于一个简单的point结构,我认为有一个论点认为类是多余的,特别是当你可以这样做时:

x, y = get_point(foo)
Run Code Online (Sandbox Code Playgroud)

我想说这和;一样具有表现力point.xpoint.y它也可能更快(无论如何,比普通类 - 没有__dict__查找)并且它非常可读,假设元组只包含几个项目。

我决定是否将某些内容放入类中的方法更多地与我在整个程序中使用数据的方式有关:我问自己“这是状态吗?” 如果我知道一些数据会发生很大变化,并且需要存储在一个地方并由一组专门构建的函数进行操作,那么我知道数据可能是状态,我至少应该考虑将其放入一类。另一方面,如果我有一些不会改变的数据,或者是短暂的,一旦我完成它就应该消失,它可能不是状态,并且可能不需要进入类。

当然,这只是一个经验法则;例如,我可以想到您可能需要某种“记录”类型的情况,以便您可以操作相当复杂的数据集合,而无需 15 个不同的局部变量(因此存在namdetuple)。但通常,如果您只操作其中的一两个值,那么最好创建一个只接受一两个值并返回一两个值的函数,为此,元组或列表就非常合适。