如何处理长路径名以符合 PEP8 规范?

8

如何处理像下面这样的长路径名以符合pep8标准?即使变得有些难读,每行79个字符是否都是必须的呢?

def setUp(self):
    self.patcher1 = patch('projectname.common.credential.CredentialCache.mymethodname')                 

1
请注意,79仅适用于标准库中的代码。PEP 8对其他代码明确更加宽松:“一些团队强烈倾向于更长的行长度。对于由可以就此问题达成协议的团队专门或主要维护的代码,可以将名义行长度从80增加到100个字符(有效地将最大长度增加到99个字符),前提是注释和文档字符串仍然在72个字符处换行。” - chepner
4个回答

7
有多种方法可以实现这一点:
  1. Use a variable to store this

    def setUp(self):
        path = 'projectname.common.credential.CredentialCache.mymethodname'
        self.patcher1 = patch(path)
    
  2. String concatenation:

    An assignment like v = ("a" "b" "c") gets converted into v = "abc":

    def setUp(self):
        self.patcher1 = patch(
            "projectname.common.credential."
            "CredentialCache.mymethodname")
    
  3. Tell pep8 that we don't use 80-column terminals anymore with --max-line-length=100 (or some sufficiently reasonable value). (Hat Tip @chepner below :) )


2
告诉 pep8 我们不再使用80列终端,而是使用 --max-line-length=100(或其他合理值)。 - chepner
2
为什么在 patch(( 中会出现双括号?只使用一组括号同样有效。 - khelwood
@khelwood 在这种情况下,是的,它可以工作,但如果有多个这样的字符串,我们需要多个括号。将添加一个注释来说明这一点。 - Anshul Goyal
我认为多个括号永远不会是必要的;用逗号将它们分开作为多个参数就足以防止解释器将它们连接起来。 - chepner
@chepner 您是正确的,在shell中验证过了;我错误地记得那不起作用。 - Anshul Goyal
@mu無,感谢您提出了处理此问题的不同方法。目前看来,#2似乎是一个简单而不错的解决方案,但#3真的很有用! - James C.

2

80列的指导方针不仅适用于在1980年代使用barkley unix终端的人们,而且还可以确保项目之间的一些统一性。由此,您可以将IDE的GUI设置为自己喜欢的样子,并确信它对所有不同的项目都很好。

遗憾的是,有时候最好的解决方案是违反它,这种情况极为罕见但确实会发生。因此,您可以使用注释标记该行:# noinspection PyPep8,以便将代码转换为:

def setUp(self):
    # noinspection PyPep8
    self.patcher1 = patch('projectname.common.credential.CredentialCache.mymethodname')   

这将使您能够全面遵循pep8的指南,包括行限制,并无需担心此虚假报告。不幸的是,这个指令并不被所有检查器支持,但它正在慢慢得到支持。


有一定的限制对于统一性是有用的;但将这个限制设为80对于大多数人来说是人为地过于严格的(特别是在Python中,因为缩进要求会给行长度增加一些不可移除的开销)。 - chepner
@chepner 如果你需要深入缩进,那么你的代码必须经过非常严重的重构。而且你达到了80列标记的事实也表明了这一点。 - Tymoteusz Paul
用户的示例已经展示了缩进的效果。一个类中的单个方法就已经施加了2级缩进的“惩罚”,这是无法合理移除的。这一点在Raymond Hettinger的PyCon 2015演讲《超越PEP 8》中得到了特别解决。链接 - chepner
@chepner,这不是缩进的影响,而是由于作为函数参数使用的过长字符串的影响,这可以非常容易地分解。正如您所看到的,缩进只占整行的少数部分,但您仍然试图将其归咎于它。因此,您可能需要提供一些更好的示例,以实际展示是缩进而不是可怕的代码设计导致了超过80列的情况。 - Tymoteusz Paul
一个类,包含一个方法,该方法使用一个循环,其中包含一个if语句,该语句使用一个logging.Logger实例。现在我们已经有了4个缩进级别,对于日志消息本身占用80个字符限制的大块内容是完全合理的。你只能通过使用少于推荐的4个空格进行缩进来收回有限的空间。为什么我必须强制将字符串分成两部分,仅仅因为它将行长度推到了85个字符? - chepner
@chepner,你没有现实生活中的例子吗?那么,让我们坚持你的想象力。在这种情况下,我会将逻辑移入函数或类方法中,而主要函数仅作为门面,调用带有最终条件的函数。这样,您最初的代码不会超过2个缩进级别,留下了足够的空间来实践任何您想要的事情。请随意向我展示一个证明我错误的现实生活例子。当然,您可以做任何您想做的事情,但是当没有人愿意在以后处理您的丑陋代码时,请不要感到惊讶。 - Tymoteusz Paul

2
在PEP8中,79个字符的限制更多地基于历史信仰而非实际可读性。PEP8的所有内容都是指南,但这一点比大部分建议更经常被忽略。即使pep8工具也有一个特定选项来更改被认为“过长”的值。
pep8 --max-line-length 100 myscript.py

我经常直接禁用测试:

pep8 --ignore E501 myscript.py

1

我更喜欢使用连接的变体。

def setUp(self):
    self.patcher1 = patch(
        "projectname.common.credential."
        "CredentialCache.mymethodname")

在调用函数时,也不需要使用拼接大括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接