在Python中拆分元组-最佳实践?

在Python中拆分元组-最佳实践?,python,tuples,Python,Tuples,我在Python代码中有一个方法,它返回一个元组——一个来自SQL查询的行。假设它有三个字段:(jobId、label、username) 为了便于在函数之间传递,我将整个元组作为一个名为“job”的变量传递。然而,最终,我想要得到比特,所以我一直在使用这样的代码: (作业ID、标签、用户名)=作业 然而,我意识到这是一场维护噩梦,因为现在我无法在不破坏所有现有代码的情况下向结果集中添加新字段。我应该怎么写这个 以下是我的两个最佳猜测: (作业ID、标签、用户名)=(作业[0]、作业[1]、作业

我在Python代码中有一个方法,它返回一个元组——一个来自SQL查询的行。假设它有三个字段:(jobId、label、username)

为了便于在函数之间传递,我将整个元组作为一个名为“job”的变量传递。然而,最终,我想要得到比特,所以我一直在使用这样的代码: (作业ID、标签、用户名)=作业

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

以下是我的两个最佳猜测: (作业ID、标签、用户名)=(作业[0]、作业[1]、作业[2]) …但如果有15…20个字段,则无法很好地进行缩放


或者直接将SQL查询的结果转换成字典并传递(我无法控制它以元组的形式开始生命,这对我来说是固定的)

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

例如:

job={}
job['jobid'], job['label'], job['username']=<querycode>
job={}
作业['jobid'],作业['label'],作业['username']=

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

如果你想要一些语法更友好的东西,你可能想看看关于一个简单的“类似结构”对象的答案。通过这种方式,您可以传递对象,例如
作业
,并比元组或dict更容易访问其字段:

job.jobId, job.username = jobId, username

对于您的案例来说,这可能有些过分,但我会尝试创建一个“Job”类,该类将tuple作为其构造函数参数,并具有相应的属性。然后我会将这个类的实例传递给大家。

我会使用字典。可以通过以下方式将元组转换为字典:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])
值=
keys=[“作业ID”、“标签”、“用户名”]
job=dict([[key[i],value[i]]表示X范围内的i(len(value)))
这将首先创建一个数组[[“jobid”,val1],“label”,val2],“username”,val3]],然后将其转换为字典。如果结果顺序或计数发生更改,则只需更改键列表以匹配新结果

PS我自己对Python还很了解,所以可能有更好的方法来实现这一点。

这个怎么样:

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)
,稍后再使用字典查找。。。只需编辑您的
\uuuu init\uuu
方法!像斯塔尔那样的人。

@Staale

有一个更好的方法:

job = dict(zip(keys, values))

这是一个老问题,但由于没有人提到它,我将从Python食谱中添加以下内容:


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

这是一个老问题,但是

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

这是一个特别有用的部分:

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


如果您使用的是MySQLdb包,那么可以将游标对象设置为返回dicts而不是元组

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

这也是非常易于维护的代码,唯一的“问题”是重新构建代码以处理字典。Python中一个常见的新手错误是在zip足够时使用列表理解。其他好处:namedtuple方法使用的内存比字典少,并且它支持更新值的_replace()方法。从技术上讲,
\u replace()
使用替换的值创建一个新元组,因为
namedtuple
类的实例与常规元组一样是不可变的。