5

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

我知道从长远来看,用户定义的数据类型更好,因为path.min_costandpoint.x, point.ypath[2]and更具表现力point[0], point[1]。但是当我只需要从一个函数中返回多个东西时,我觉得工作量太大了。

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

谢谢。

4

3 回答 3

8

你知道collections.namedtuple吗?(从 2.6 开始

def getLocation(stuff):
    return collections.namedtuple('Point', 'x, y')(x, y)

或者,更有效地,

Point = collections.namedtuple('Point', 'x, y')
def getLocation(stuff):
    return Point(x, y)

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

于 2012-07-23T08:56:10.167 回答
2

这当然是主观的,但我会尽量遵守最小意外原则。

如果您返回的值描述了一个对象的特征(如您的示例中的point.xpoint.y),那么我将使用一个类。

如果它们不是同一个对象的一部分(比如说return min, max),那么它们应该是一个元组。

于 2012-07-23T08:50:32.987 回答
2

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

x, y = get_point(foo)

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

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

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

于 2012-07-23T09:42:03.077 回答