如何在Python注释中格式化长URL并且符合PEP8规范。

117

在块注释中,我想引用一个超过80个字符的URL。

有什么首选约定来显示这个URL吗?

我知道 bit.ly 是一个选择,但 URL 本身是描述性的。缩短它,然后再有一个嵌套注释来描述缩短后的URL似乎不是一个好的解决方案。

8个回答

91

不要破坏网址:

忽略某个指南的其他好理由:

  1. 遵循该指南会导致代码变得更难阅读,即使对于习惯于阅读符合此PEP的代码的人来说也是如此...

来源:

# A Foolish Consistency is the Hobgoblin of Little Minds [1]
# [1]: http://www.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds

您可以在代码行末尾使用# noqa来停止PEP8/pycodestyle/Flake8运行该检查。这也可以避免IDE中的警告。

# [1]: http://www.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds # noqa

7
我同意;然而,PyCharm并没有让忽略代码中长行的问题变得容易,除非你在各个地方乱用 '# noinspection LongLine'(或者类似的)这样丑陋的引用。我认为更大的问题在于RST格式本身的限制,即无法在URL中插入不显示的换行符。 - user4805123
11
答案没有回答如何做到符合要求,因此如果您使用了一个代码检查工具,它仍然会显示警告信息。 - Efren
7
@jfs的回答应该是:“在这种情况下,长行符合PEP8规范”。 - Efren
2
@Efren 这正是我的答案:“我应该如何格式化...以及符合Pep-8标准” -> “不要破坏URL”。 - jfs
3
我刚刚发现了 control-click !! 现在我知道为什么你不想在评论中打破URL。 - Bob Stein
显示剩余8条评论

79

来自PEP8

但最重要的是:知道何时不一致——有时样式指南并不适用。如果有疑问,使用您最好的判断力。查看其他示例,然后决定哪个看起来最好。不要犹豫去询问!

打破某个特定规则的两个好理由:

  • 当应用规则会使代码变得更加难读,即使是习惯于遵循规则的人也是如此。

就我个人而言,我会采纳这个建议,并将完整的描述性URL留在评论中供人们使用。


59
您可以在行末使用# noqa 来停止PEP8 / Flake8运行该检查。这是由PEP8通过以下方式允许的:

特殊情况并不足以打破规则。


3
优美。我在Vim中使用pyflakes,并且在同意的规则集(我们的情况下,maccabe要求更宽松,但不包括80行限制)返回零警告之前不会提交更改。告诉同事最简单的方法是:我没有分割多行,因为这样做毫无意义。 - Peter Host
4
谢谢 @Sardathrion,应该得到更多票数,因为它实际上提供了一个实用的解决方案。 - ezdazuzena
1
在PyCharm中,#noqa是我发现的唯一一种禁用长注释行警告的方法。还有其他几个讨厌的警告,其中#noinspection无法解决。非常有帮助。 - Bob Stein
只是为了明确:应该是 # very_long_url.com noqa 还是 # very_long_url.com # noqa?无论哪种方式,Pylint似乎都会忽略它们,并且显然需要# pylint: disable=line-too-long # noqa: E501 - Eric Duminil

22

我建议不要管它...

PEP20

特例没有足够的理由来违反规则。

尽管实用性比纯粹性更重要。

能够快速复制/粘贴URL比在将内容粘贴到浏览器中时移除换行符更加实用。


21

如果您正在使用flake8:

"""
long-url: https://dev59.com/LGgv5IYBdhLWcg3wQ-gU
"""  # noqa

1

在整个文档字符串中添加“#noqa”是可行的,但这意味着您会失去整个文档字符串上的内省能力,因此可能会错过其他问题。

如果您想将noqa缩小到只有长行,则可以仅将其添加到长行中,但是在使用sphinx构建文档时,“#noqa”会显示在文档中。

在这种情况下,您可以构建自定义的autodoc处理方法。请参见this answer

以下是我修改后的版本,

from sphinx.application import Sphinx
import re

def setup(app):

    noqa_regex = re.compile('^(.*)\s\s#\snoqa.*$')

    def trim_noqa(app, what_, name, obj, options):
        for i, line in enumerate(lines):
            if noqa_regex.match(line):
                new_line = noqa_regex.sub(r'\1', line)
                lines[i] = new_line

    app.connect('autodoc-process-docstring', trim_noqa)
    return app

你对自己的说法确定吗?https://dev59.com/LGgv5IYBdhLWcg3wQ-gU#39768096 - Eric Duminil
1
这适用于整个docstring,但此解决方案仅适用于长行。如果您将noqa应用于整个docstring,则会忽略其他问题。请注意,我说的是如果noqa在docstring中。我已编辑我的回答以明确这一点。 - Edward Spencer

-4

12
风险在于链接缩短服务消失后,我们将无法知道链接的地址。ArchiveTeam(由与Archive.org有关系的领导人员带领)致力于保存链接缩短服务的整个工作。 - Ahmed Fasih
3
不仅如此,原始URL还包含相关信息。URL缩短服务会丢失这些信息。 - Julien Chastang

-6

我的选择会是:

URL = ('https://dev59.com/LGgv5IYBdhLWcg3wQ-gU'
       'how-should-i-format-a-long-url-in-a-python-'
       'comment-and-still-be-pep8-compliant')

5
这种方式复制粘贴太过麻烦,无法方便地使用。 - Kel Solaar
如果你不想复制和粘贴,这个方案非常好用,特别是在工程请求API时。看到一个完美的解决方案被踩,让我感到很沮丧...这就是软件行业的问题所在... - A Campos

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