成语为长元组拆包

时间:2014-09-25 10:21:43

标签: python coding-style pep8

场景:由于SQL查询,您有一个长元组,并希望将其解压缩为单个值。符合PEP8的最佳方法是什么?到目前为止,我有以下三种选择:

  1. 单个赋值,使用反斜杠分割为多行

    person_id, first_name, last_name, email, \
        birth_date, graduation_year, home_street, \
        home_city, home_zip, mail_street, mail_city, \
        mail_zip = row
    
  2. 单个作业,在parantheses中分组左侧并且没有反斜杠的断行

    (person_id, first_name, last_name, email,
        birth_date, graduation_year, home_street,
        home_city, home_zip, mail_street, mail_city,
        mail_zip) = row
    
  3. 分成多个作业,每个作业合为一行

    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]
    
  4. 三个选项中哪一个最好?还有什么更好的吗?

2 个答案:

答案 0 :(得分:18)

解答您的问题"三个选项中哪一个最好?"

pep8州:

  

包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续。通过在括号中包装表达式,可以在多行中分割长行。这些应该优先使用反斜杠进行续行。

这意味着第二个优于第一个。第三个也很好地符合pep8,但个人不会推荐它。

答案 1 :(得分:7)

要回答"还有什么更好的" ,我建议namedtuple允许您轻松访问各个数据项:

>>> 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

这意味着您可以访问属性,而不是单独的名称,但重量轻于构建类,将查询中的所有数据保存在一起,并通过合理的名称公开值。