成语为长元组拆包

kon*_*iik 16 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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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]
    
    Run Code Online (Sandbox Code Playgroud)

三个选项中哪一个最好?有更好的吗?

Rem*_*ing 19

解答你的问题"三种选择中哪一种最好?"

pep8说:

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

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

  • +1 第三种效率低得多,需要更多字节代码才能完成相同的任务。 (2认同)

jon*_*rpe 7

要回答"有什么更好的",我建议a 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
Run Code Online (Sandbox Code Playgroud)

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