格式化大列表理解的最佳实践?

Best Practice to Format Large List Comprehension?

我有一个相当大的对象集合,我只需要 4 个数据点,它们如下所示:

{
    'date': '01/01/1900'
    'info': {'contact': 'Jane Doe',
             'id': 298342,
             'address': '123 Street Rd.'},
    'account': {'name': 'Random Event Name',
                'id': 9623075},
    'guest_count': 523,
    'rooms': [{'name': 'Room A',
               'id': 209353,
               'capacity': 300},
              {'name': 'Room B',
               'id': 630923,
               'capacity': 50}],
    'start_time': '10:00:00',
    'end_time': '15:45:00',
              .
              .
              .
}

我有一个简单的 for 循环来遍历对象并提取我需要的信息:

info = []
for event in events:

    start_time = event['start_time']

    location = 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House'

    name = event['account']['name']

    guest_count = event['guest_count']

    info.append([start_time, location, name, guest_count])

然后我将其转换为以下列表理解:

info = [[event['start_time'], 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House', event['account']['name'], event['guest_count']] for event in events['results']]

这绝对违反了 80 个字符的规则,并且似乎找不到任何关于如何格式化可变重列表理解的文档。

这就是我最后做的,但它看起来还是很丑陋:

sanitized_events = [
    [event['start_time'], 
    'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House', 
    event['account']['name'], 
    event['guest_count']] for event in events]

某些代码片段不应折叠为列表理解。如果您尝试并且它似乎变得更复杂,那么值得一问它是否是一个正确的开始路径。

要考虑的一个途径始终是辅助函数

def _sanitize(event):
  location = 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House'
  return (event['start_time'],
          location,
          event['account']['name'],
          event['guest_count'])

sanitized_events = [_sanitize(event) for event in events]

将列表创建逻辑与处理逻辑分开,从而更容易理解高级概念,同时可以在需要时跳转到细节。

我会这样做:

info = [[event['start_time'],
         'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House',
         event['account']['name'],
         event['guest_count']] for event in events['results']]

我认为足够可读。

Maximum Line Length is covered in PEP 8。注意它说的地方:

Some teams strongly prefer a longer line length. For code maintained exclusively or primarily by a team that can reach agreement on this issue, it is okay to increase the line length limit up to 99 characters, provided that comments and docstrings are still wrapped at 72 characters.

所以您实际上并没有限制在 <80 个字符(用于代码)。我个人发现 90 几乎适用于我使用的所有工具(巧合的是用于在网站上发布代码)。

sanitized_events = \
[
    [ 
        event['start_time'],      
        
        'Offsite' if (event ['rooms'][0]['name'] == 'Offsite')
        else 'In-House',
                                
        event['account']['name']  
    ], 

    event['guest_count']
    
    for event in events
]

对于嵌套的复杂结构,最好使用c语言中块的相同约定:开括号和闭括号各占一行,匹配的括号在同一列。列表内容缩进

另外用空行包围多行项目。可选择使用空行将 for 子句与项目分开。