python - 关于限制行长度以符合 PEP8 的不同方式的样式的一些建议

标签 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 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 block 的内容从哪里开始。

    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 的代码的人也是如此。”

如有任何建议,我们将不胜感激。

最佳答案

对于你的 __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 ,您可能首先将其分解为一个临时变量。

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

关于python - 关于限制行长度以符合 PEP8 的不同方式的样式的一些建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099860/

相关文章:

c++ - Python 的 file.read(2) 在 C++ 中有模拟吗?

python - Django:在验证之前处理表单字段

Java 代码约定 : must match pattern '^[a-z][a-zA-Z0-9]*$'

c# - 哪个更利于可读性?

python - 在 Python 程序中嵌入(创建)交互式 Python shell

python - 拆分 IPython Magic Shell 多行

C#:测试 int x 是否是给定集合的元素的最优雅方法?

Python 正确的代码格式 (PEP8)

python - 从 QuickFix 窗口应用自动 pep8 修复

python - 惯用的 Python - 检查零