PEP 8和列表理解

时间:2015-05-06 00:35:54

标签: python

我似乎对PEP 8遇到了一些问题。

我正在使用长度超过79个字符的列表理解。因此,我的文本编辑器正在尖叫着对我做些什么,并且在编码时要注意它。

enter image description here

return [(i['user_id'], i['id']) for i in j['collection'] if i and i['user_id']]

所以,我试图打破界限,但现在它抱怨我的换行是出于视觉目的。

enter image description here

return [(i['user_id'], i['id']) for i in j['collection']
    if i and i['user_id']]

在这样的泡菜中,男人该做什么?

编辑:根据答案,在这种情况下,我选择了列表理解的可读性,现在它对读者更有意义:

tracks = set()

for track in json['collection']:
    if track and track['user_id']:
        tracks.add((track['user_id'], track['id']))

4 个答案:

答案 0 :(得分:6)

使用pep8时常识适用。如果你不能在80个字符内拟合一行逻辑,那么几乎总是表明这条线必须被重写。在这种情况下确实如此,因为我甚至无法开始尝试理解那条线应该做什么。

但是如果你将它移动到一个更易读的格式,那么不仅你的行数会增加,而且你的可读性水平也会提高,这样就可以为user而不是{{{{}}}提供适当的变量名称。 1}}。这将使您在将来的维护变得更加容易,更不用说其他人是否需要查看它。

所以把这个例子放到实际的代码中,这就是我用它做的事情(使用一个很好的函数包来使样本更容易阅读!):

i

您可以轻松地将其复制/粘贴到您的interpetor中,看它是否有效。更重要的是 - 它非常容易维护和跟踪,在密封功能中封装了清晰的api。

答案 1 :(得分:5)

如果你想严格遵守pep8,那么悬挂的缩进就是你的朋友。

return [
    (i['user_id'], i['id'])
    for i in j['collection']
    if i and i['user_id']]

答案 2 :(得分:1)

虽然我很喜欢放宽严格的80-char限制,并且(如评论中所述)在PyCon 2015的这个引人注目的演讲中Raymond Hettinger也是如此,在这个特殊情况下,最干净的事情是可能只是将它分成两行:

valid_things = (i for i in j['collection'] if i and i['user_id'])
return [(i['user_id'], i['id']) for i in valid_things]

这样"过滤"和"选择"逻辑清晰地分开,并以比将它们组合在一起更可读的方式呈现。

功能倾向的另一种选择:

return map(itemgetter('user_id', 'id'), valid_things)

答案 3 :(得分:0)

你只需要正确缩进第二行:

return [(i['user_id'], i['id']) for i in j['collection']
        if i and i['user_id']]

Confirmed PEP8在线,但请告诉我它是否适合您。

就个人而言,我不喜欢表达和来源,但条件是分开的。我相当清楚地看到了表达,而不是条件。突出你得到的。所以我会做其中一个:

return [(i['user_id'], i['id'])
        for i in j['collection'] if i and i['user_id']]

return [(i['user_id'], i['id'])
        for i in j['collection']
        if i and i['user_id']]

澄清:这就是我缩进/破解的方式。我没有考虑变量名称,因为我只是想直接回答并解释PEP8错误是什么以及如何解决它,因为没有人有。