我似乎对PEP 8遇到了一些问题。
我正在使用长度超过79个字符的列表理解。因此,我的文本编辑器正在尖叫着对我做些什么,并且在编码时要注意它。
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']]
在这样的泡菜中,男人该做什么?
编辑:根据答案,在这种情况下,我选择了列表理解的可读性,现在它对读者更有意义:
tracks = set()
for track in json['collection']:
if track and track['user_id']:
tracks.add((track['user_id'], track['id']))
答案 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错误是什么以及如何解决它,因为没有人有。