题
我的 Python 代码中有一个方法,它返回一个元组 - 来自 SQL 查询的一行。假设它有三个字段:(职位 ID、标签、用户名)
为了便于在函数之间传递它,我将整个元组作为一个名为“job”的变量传递。然而,最终我想了解这些内容,所以我一直在使用这样的代码:(职位ID、标签、用户名) = 职位
然而,我意识到这是一个维护噩梦,因为现在我永远无法在不破坏所有现有代码的情况下向结果集中添加新字段。我应该怎么写这个?
这是我的两个最佳猜测:(JobID,Label,用户名)=(Job [0],Job [1],Job [2])...但是当您有15个字段时,这并不能很好地扩展
或者直接将 SQL 查询的结果转换为字典并传递(我无法控制它作为元组开始的事实,这对我来说是固定的)
解决方案
我想说字典绝对是最好的方法。它很容易扩展,允许您为每个值指定一个合理的名称,并且 Python 有许多用于使用和操作字典的内置语言功能。如果稍后需要添加更多字段,您需要更改的只是将元组转换为字典的代码以及实际使用新值的代码。
例如:
job={}
job['jobid'], job['label'], job['username']=<querycode>
其他提示
@斯塔尔
有一个更好的办法:
job = dict(zip(keys, values))
这是一个老问题,但是......
我建议在这种情况下使用命名元组: 集合.namedtuple
您会发现这部分特别有用:
子类化对于添加新的存储字段没有用。相反,只需从 _fields 属性创建一个新的命名元组类型。
也许这对于您的情况来说有点过分了,但我很想创建一个“Job”类,该类将元组作为其构造函数参数,并在其上具有相应的属性。然后我会传递这个类的实例。
我会用字典。您可以通过以下方式将元组转换为字典:
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 还很陌生,所以可能有更好的方法来做到这一点。
一个老问题,但由于没有人提到它,我将从 Python Cookbook 中添加这个:
这个配方是专门为处理数据库结果而设计的,dtuple 解决方案允许您通过名称或索引号访问结果。这避免了必须通过下标访问所有内容,这非常难以维护,如您的问题中所述。
对于元组,添加或更改字段总是很麻烦。你说得对,字典会好得多。
如果你想要一些语法稍微友好的东西,你可能想看看答案 这个问题 关于一个简单的“类似结构”的对象。这样你就可以传递一个对象,比如说 job
, ,并且比元组或字典更容易访问其字段:
job.jobId, job.username = jobId, username
如果您使用 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
这个怎么样:
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__
方法!就像斯塔尔所做的那样。