243

正如 PEP8 建议将您的 python 程序的列规则保持在 80 列以下,我如何才能遵守长字符串的规定,即

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."

我将如何将其扩展到以下行,即

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."
4

13 回答 13

346

由于相邻的字符串常量是自动连接的,你可以这样编码:

s = ("this is my really, really, really, really, really, really, "  
     "really long string that I'd like to shorten.")

注意没有加号,我在示例格式后面添加了额外的逗号和空格。

就我个人而言,我不喜欢反斜杠,我记得在某处读过它的使用实际上已被弃用,而支持这种更明确的形式。记住“显式胜于隐式”。

我认为反斜杠不太清晰,也不太有用,因为这实际上是在转义换行符。如果有必要的话,不可能在它后面加上行尾注释。可以使用连接的字符串常量来做到这一点:

s = ("this is my really, really, really, really, really, really, " # comments ok
     "really long string that I'd like to shorten.")

我使用谷歌搜索“python line length”,它返回 PEP8 链接作为第一个结果,但也链接到另一个关于此主题的好 StackOverflow 帖子:“为什么 Python PEP-8 应指定最大行长度为 79 个字符?

另一个好的搜索短语是“python line continuation”。

于 2009-12-09T15:31:49.670 回答
138

隐式连接可能是最干净的解决方案:

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

编辑反思我同意托德的建议使用括号而不是行继续更好,因为他给出的所有原因。我唯一的犹豫是,将括号字符串与元组混淆相对容易。

于 2009-12-09T15:25:52.410 回答
17

我认为您问题中最重要的词是“建议”。

编码标准很有趣。通常,他们提供的指南在编写时具有非常好的基础(例如,大多数终端无法在一行中显示超过 80 个字符),但随着时间的推移,它们在功能上已经过时,但仍然严格遵守。我想您在这里需要做的是权衡“打破”该特定建议的相对优点与代码的可读性和可维护性。

抱歉,这并不能直接回答您的问题。

于 2009-12-09T15:24:55.927 回答
16

你丢失了一个空格,你可能需要一个续行字符,即。一个\

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."

甚至:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."

Parens 也可以代替行继续,但是你冒着有人认为你打算有一个元组并且忘记了逗号的风险。举个例子:

s = ("this is my really, really, really, really, really, really"
    " really long string that I'd like to shorten.")

相对:

s = ("this is my really, really, really, really, really, really",
    " really long string that I'd like to shorten.")

使用 Python 的动态类型,代码可能会以任何一种方式运行,但会产生与您不希望的结果不正确的结果。

于 2009-12-09T15:24:16.223 回答
4

如果您必须插入一个长字符串文字并希望 flake8 关闭,您可以使用它的关闭指令。例如,在一个测试例程中,我定义了一些虚假的 CSV 输入。我发现将它拆分为更多行会非常混乱,所以我决定添加# noqa: E501如下:

csv_test_content = """"STATION","DATE","SOURCE","LATITUDE","LONGITUDE","ELEVATION","NAME","REPORT_TYPE","CALL_SIGN","QUALITY_CONTROL","WND","CIG","VIS","TMP","DEW","SLP","AA1","AA2","AY1","AY2","GF1","MW1","REM"
"94733099999","2019-01-03T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","050,1,N,0010,1","22000,1,9,N","025000,1,9,9","+0260,1","+0210,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1","01,99,1,99,9,99,9,99999,9,99,9,99,9","01,1","SYN05294733 11/75 10502 10260 20210 60004 70100 333 70000="
"94733099999","2019-01-04T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","090,1,N,0021,1","22000,1,9,N","025000,1,9,9","+0378,1","+0172,1","99999,9","06,0000,9,1",,"0,1,02,1","0,1,02,1","03,99,1,99,9,99,9,99999,9,99,9,99,9","03,1","SYN04294733 11/75 30904 10378 20172 60001 70300="
"94733099999","2019-01-04T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","290,1,N,0057,1","99999,9,9,N","020000,1,9,9","+0339,1","+0201,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1",,"02,1","SYN05294733 11970 02911 10339 20201 60004 70200 333 70000="
"94733099999","2019-01-05T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","200,1,N,0026,1","99999,9,9,N","000100,1,9,9","+0209,1","+0193,1","99999,9","24,0004,3,1",,"1,1,02,1","1,1,02,1","08,99,1,99,9,99,9,99999,9,99,9,99,9","51,1","SYN05294733 11/01 82005 10209 20193 69944 75111 333 70004="
"94733099999","2019-01-08T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","070,1,N,0026,1","22000,1,9,N","025000,1,9,9","+0344,1","+0213,1","99999,9","06,0000,9,1",,"2,1,02,1","2,1,02,1","04,99,1,99,9,99,9,99999,9,99,9,99,9","02,1","SYN04294733 11/75 40705 10344 20213 60001 70222="
"""  # noqa: E501
于 2020-01-23T13:20:20.827 回答
3

反斜杠:

s = "this is my really, really, really, really, really, really" +  \
    "really long string that I'd like to shorten."

或包裹在括号中:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.")
于 2009-12-09T15:24:01.977 回答
3

这些都是很好的答案,但我找不到可以帮助我编辑“隐式连接”字符串的编辑器插件,所以我写了一个包来让我更轻松。

如果在这个旧线程中徘徊的人想查看它,请在 pip (安装段落)上查看。以 html 的方式格式化多行字符串(压缩空格,一个新段落的两个换行符,不用担心行之间的空格)。

from paragraphs import par


class SuddenDeathError(Exception):
    def __init__(self, cause: str) -> None:
        self.cause = cause

    def __str__(self):
        return par(
            f""" Y - e - e - e - es, Lord love you! Why should she die of
            {self.cause}? She come through diphtheria right enough the year
            before. I saw her with my own eyes. Fairly blue with it, she
            was. They all thought she was dead; but my father he kept ladling
            gin down her throat till she came to so sudden that she bit the bowl
            off the spoon. 

            What call would a woman with that strength in her have to die of
            {self.cause}? What become of her new straw hat that should have
            come to me? Somebody pinched it; and what I say is, them as pinched
            it done her in."""
        )


raise SuddenDeathError("influenza")

变成...

__main__.SuddenDeathError: Y - e - e - e - es, Lord love you! Why should she die of influenza? She come through diphtheria right enough the year before. I saw her with my own eyes. Fairly blue with it, she was. They all thought she was dead; but my father he kept ladling gin down her throat till she came to so sudden that she bit the bowl off the spoon.

What call would a woman with that strength in her have to die of influenza? What become of her new straw hat that should have come to me? Somebody pinched it; and what I say is, them as pinched it done her in.

一切都与(Vim)'gq'轻松对齐

于 2019-07-08T18:49:48.493 回答
1

可用选项:

  • 反斜杠"foo" \ "bar"
  • 加号后跟反斜杠"foo" + \ "bar"
  • 括号
    • ("foo" "bar")
    • 加号的括号("foo" + "bar")
    • PEP8,E502:括号之间的反斜杠是多余的

避免

避免使用逗号的括号:("foo", "bar")它定义了一个元组。


>>> s = "a" \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = "a" + \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = ("a"
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> s = ("a",
... "b")
>>> type(s)
<class 'tuple'>
>>> s = ("a" + 
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> 
于 2019-07-26T19:08:53.340 回答
0

使用 a\您可以将语句扩展到多行:

s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."

应该管用。

于 2009-12-09T15:24:08.907 回答
0

我倾向于使用此处未提及的几种方法来指定大字符串,但这些方法适用于非常具体的场景。YMMV...

  • 多行文本块,通常带有格式化的标记(不是您所要求的,但仍然有用):

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
    
  • 通过您喜欢的任何字符串插值方法逐段增长变量:

    var = 'This is the start of a very,'
    var = f'{var} very long string which could'
    var = f'{var} contain a ridiculous number'
    var = f'{var} of words.'
    
  • 从文件中读取它。PEP-8 不限制文件中字符串的长度;只是你的代码行。:)

  • 使用蛮力或您的编辑器使用换行符将字符串拆分为可管理的行,然后删除所有换行符。(类似于我列出的第一种技术):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')
    
于 2018-06-27T02:45:25.040 回答
0

我过去使用过 textwrap.dedent 。这有点麻烦,所以我现在更喜欢行延续,但如果你真的想要块缩进,我认为这很棒。

示例代码(修剪是用切片去掉第一个 '\n'):

import textwrap as tw
x = """\
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x))

解释:

dedent 根据换行前第一行文本中的空白计算缩进。如果您想对其进行调整,您可以使用该re模块轻松地重新实现它。

这种方法的局限性在于,很长的行可能仍然比您想要的长,在这种情况下,连接字符串的其他方法更合适。

于 2018-08-15T17:53:28.030 回答
0

使用黑色[https://github.com/psf/black] 我像这样格式化它。

   help=f"""filters, lista de filtros para cargar las base de conocimiento.
   Pueden mandarse solo algunos filtros ya que no son obligatorios,
   por ejemplo, si no se manda sts, se cargarán todos las bases de todos los estados.""",
于 2021-03-11T19:02:23.143 回答
0
message = f"Variable : child({type(child)}) -> is not of"\
        " type Node."

这种语法对我有用。注意第二条语句的缩进,应该正确缩进。

于 2021-06-07T17:41:06.767 回答