13

我的 Python 代码中有一个方法,它返回一个元组——来自 SQL 查询的一行。假设它有三个字段:(jobId,标签,用户名)

为了便于在函数之间传递它,我一直将整个元组作为一个名为“job”的变量传递。然而,最终,我想了解一下,所以我一直在使用这样的代码: (jobId, label, username) = job

然而,我意识到这是一场维护噩梦,因为现在我永远无法在不破坏所有现有代码的情况下向结果集中添加新字段。我应该怎么写这个?

这是我最好的两个猜测: (jobId, label, username) = (job[0], job[1], job[2]) ...但是当您有 15...20 个字段时,这不能很好地扩展

或立即将 SQL 查询的结果转换为字典并将其传递(我无法控制它以元组的形式开始的事实,这对我来说是固定的)

4

9 回答 9

14

@Staale

有一个更好的方法:

job = dict(zip(keys, values))
于 2008-09-03T14:51:48.617 回答
13

我会说字典绝对是最好的方法。它易于扩展,允许您为每个值指定一个合理的名称,并且 Python 具有许多用于使用和操作字典的内置语言功能。如果以后需要添加更多字段,只需更改将元组转换为字典的代码以及实际使用新值的代码。

例如:

job={}
job['jobid'], job['label'], job['username']=<querycode>
于 2008-09-03T13:50:24.927 回答
5

这是一个老问题,但是......

我建议在这种情况下使用命名元组:collections.namedtuple

这是您特别有用的部分:

子类化对于添加新的存储字段没有用处。相反,只需从 _fields 属性创建一个新的命名元组类型。

于 2009-07-17T16:08:40.003 回答
3

也许这对您的情况来说有点过头了,但我很想创建一个“Job”类,它将元组作为其构造函数参数并具有相应的属性。然后我会传递这个类的实例。

于 2008-09-03T13:57:15.923 回答
2

我会用字典。您可以通过这种方式将元组转换为字典:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

这将首先创建一个数组 [["jobid", val1], ["label", val2], ["username", val3]],然后将其转换为字典。如果结果顺序或计数发生变化,您只需更改键列表以匹配新结果。

PS 我自己在 Python 上仍然很新鲜,所以可能有更好的方法来做这件事。

于 2008-09-03T13:59:28.133 回答
2

一个老问题,但由于没有人提到它,我将从 Python Cookbook 添加这个:

秘诀 81252:使用 dtuple 进行灵活的查询结果访问

这个秘籍是专门为处理数据库结果而设计的,dtuple 解决方案允许您通过名称或索引号访问结果。如您的问题所述,这避免了必须通过难以维护的下标访问所有内容。

于 2008-12-22T20:22:43.033 回答
0

使用元组,添加或更改字段总是很麻烦。你说得对,字典会好得多。

如果你想要一些语法稍微友好的东西,你可能想看看这个问题的答案,关于一个简单的'struct-like'对象。这样你就可以传递一个对象,比如job,并比元组或字典更容易访问它的字段:

job.jobId, job.username = jobId, username
于 2008-09-03T13:51:53.160 回答
0

如果你使用 MySQLdb 包,你可以设置你的游标对象返回字典而不是元组。

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor
于 2010-04-09T16:28:06.313 回答
-2

这个怎么样:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

然后你可以这样做:

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

以后应该很容易self.fieldlist.index(field)与字典查找交换...只需编辑您的__init__方法!像 Staale 这样的东西。

于 2008-09-03T14:02:37.300 回答