关于限制线长度以符合PEP8的不同方式的风格的一些建议

时间:2014-06-07 17:32:08

标签: python coding-style pep8

我目前正在更新我的代码以符合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之后的代码的人也是如此。”

任何建议都将受到高度赞赏。

2 个答案:

答案 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')