我目前正在更新我的代码以符合PEP8最大线路长度。
我对人们认为更好的风格有两个问题。 第一个是类的初始化(或者该问题的任何函数定义)。人们只是将函数定义的所有参数分开,如果这一行长得像这样:
def __init__(self,
title,
url,
teaser,
parseDate,
updateDate,
redis,
id=None):
或者只考虑将部分拆分为第二行会更好,否则这样会太长:
def __init__(self, title, url, teaser, parseDate, updateDate, redis,
id=None):
其次:在if if语句中,我并没有真正发现条件的分裂增加了代码的清晰度,如下所示:
if self.redis.exists('article:%s' % self.url)\
and self.redis.hexists('article:%s' % self.url, 'id'):
self.id = self.redis.hget('article:%s' % self.url, 'id')
else:
self.id = self.redis.incr('articleid')
如果写得如下所示,这条线明确地说太长了,但我认为你让self.id的值取决于条件更清楚。在前面的例子中,我不太清楚条件何处结束以及if块的内容是否开始。
if self.redis.exists('article:%s' % self.url) and self.redis.hexists('article:%s' % self.url, 'id'):
self.id = self.redis.hget('article:%s' % self.url, 'id')
else:
self.id = self.redis.incr('articleid')
从python PEP8指南的角度考虑更好的代码是什么,特别是因为指南说你不应该遵循guideline:
“当应用指南时,会使代码的可读性降低,即使对于习惯于阅读此PEP之后的代码的人也是如此。”
任何建议都将受到高度赞赏。
答案 0 :(得分:3)
对于你的__init__
函数,我会去中间位置并尝试在每一行上放置一些参数,如果可能的话找到一个合理的位置来分割线:
def __init__(self, title, url, teaser,
parseDate, updateDate, redis,
id=None):
您可能还会考虑是否有办法重构代码以避免单个方法的这么多参数,或者只使用**kwargs
,接受预期的参数并明确拒绝任何额外的内容。
对于条件,利用括号内允许的隐式换行(这正是您可以将参数拆分为多行中的函数的方法)。该技术在PEP 8本身中显示。
if (self.redis.exists('article:%s' % self.url) and
self.redis.hexists('article:%s' % self.url, 'id'):
self.id = self.redis.hget('article:%s' % self.url, 'id')
else:
self.id = self.redis.incr('articled')
在这种情况下,由于您需要三次单独构造密钥,因此可以先将其分解为临时变量。
key = 'article:%s' % (self.url,)
if (self.redis.exists(key) and
self.redis.hexists(key, 'id')):
self.id = self.redis.hget(key, 'id')
else:
self.id = self.redis.incr('articled')
答案 1 :(得分:1)
我同意chepner(并且如果我有足够的业力或其他所谓的事情,他会投票支持)。
我的小修改是将“和”放在第二次检查的行上。
if (self.redis.exists('article:%s' % self.url)
and self.redis.hexists('article:%s' % self.url, 'id'):
self.id = self.redis.hget('article:%s' % self.url, 'id')
else:
self.id = self.redis.incr('articled')