Python 长元组解包的习惯用法
场景:作为SQL查询的结果,您有一个长元组,并且希望将其解压为单个值。在遵守PEP8的同时,最好的方法是什么?到目前为止,我有以下三种选择:Python 长元组解包的习惯用法,python,coding-style,pep8,Python,Coding Style,Pep8,场景:作为SQL查询的结果,您有一个长元组,并且希望将其解压为单个值。在遵守PEP8的同时,最好的方法是什么?到目前为止,我有以下三种选择: 单个赋值,使用反斜杠拆分为多行 person_id, first_name, last_name, email, \ birth_date, graduation_year, home_street, \ home_city, home_zip, mail_street, mail_city, \ mail_zip = row
person_id, first_name, last_name, email, \
birth_date, graduation_year, home_street, \
home_city, home_zip, mail_street, mail_city, \
mail_zip = row
(person_id, first_name, last_name, email,
birth_date, graduation_year, home_street,
home_city, home_zip, mail_street, mail_city,
mail_zip) = row
person_id, first_name, last_name, email = row[0:4]
birth_date, graduation_year, home_street = row[4:7]
home_city, home_zip, mail_street, mail_city = row[7:11]
mail_zip = row[11]
>>> from collections import namedtuple
>>> Person = namedtuple("Person", ['person_id', 'first_name', 'last_name',
'email', 'birth_date', 'graduation_year',
'home_street', 'home_city', 'home_zip',
'mail_street', 'mail_city', 'mail_zip'])
>>> row = range(12) # dummy data
>>> p = Person(*row) # unpack tuple into namedtuple
>>> p
Person(person_id=0, first_name=1, last_name=2, email=3, birth_date=4, graduation_year=5, home_street=6, home_city=7, home_zip=8, mail_street=9, mail_city=10, mail_zip=11)
>>> p.birth_date
4
这意味着您可以访问属性,而不是单独的名称,但重量比构建类轻,将查询中的所有数据保持在一起,并通过合理的名称公开值。回答您的问题“三个选项中哪一个是最好的?”
国家:
包装长行的首选方法是在括号、方括号和大括号内使用Python的隐含行继续。通过将表达式括在括号中,可以在多行上打断长行。应该优先使用这些选项,而不是使用反斜杠作为行延续
这意味着第二种方法优于第一种方法。第三个也不错,不过我个人不推荐。基于意见。我不喜欢在行尾加反斜杠的解决方案,因为如果代码后面有一个不可见的字符(例如空格),代码就会中断。对我来说,第二个版本是最好的选择。你考虑过一个单一的名字而不是单独的名字吗?@Matthias他问过“同时符合PEP-8”,并且PEP-8非常明确地说明了使用哪一个。也许你可以把它编入字典。@jonrsharpe为什么你投票结束这个问题,认为主要是基于观点的?问题的作者并不是在问无条件偏好,而是在问任何给定的方法是否有某些优点或缺点,对此的回答根本不是主观的。上面的第一条评论已经是一个矛盾:Matthias说“基于意见”,只是为了进一步说明反斜杠方法的客观缺点。只要您必须对相同的属性序列多次这样做,这看起来很好。然而,如果你知道你不会在多个地方解包这样的行,这可能太重了(你需要导入一个集合,定义一个命名的元组等,而不是一个或几个赋值,只为一个解包)。@koniik根据文档,
namedtuple
s“比常规元组不需要更多的内存”。定义容器的长度与当前解包的长度相同,因此只需添加两行(import
and unpack)。不过,如果你确定你只会使用一次,你可能是对的。好吧,至少,它包含了更多不完全是琐碎的步骤,这可能会让事情变得不那么明显。但同样,这取决于具体情况。+1第三种方法的效率要低得多,需要更多的字节码才能完成相同的任务。