Python 长元组解包的习惯用法

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

场景:作为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 = 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]
    
  • 三个选项中哪一个是最好的?有更好的吗?

    要回答“有更好的吗”,我建议a允许您以最小的麻烦访问单个数据项:

    >>> 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第三种方法的效率要低得多,需要更多的字节码才能完成相同的任务。