如何编写符合PEP8的非常长的字符串并阻止E501

Fed*_*rer 182 python string pep8

由于PEP8建议保持低于你的python程序的80列规则,我怎么能遵守长字符串,即

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

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

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."
Run Code Online (Sandbox Code Playgroud)

Tod*_*odd 270

此外,因为相邻的字符串常量会自动连接,所以您也可以这样编码:

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

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

我个人不喜欢反斜杠,我记得在某个地方读过它的使用实际上已被弃用,而这种形式更明确.记住"明确比隐含更好".

我认为反斜杠不那么明确且不太有用,因为这实际上是在逃避换行符.如果有必要的话,就不可能在其后面添加行结束注释.可以使用连接的字符串常量来执行此操作:

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

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

另一个好的搜索短语是"python line continuation".

  • 对于每个获得元组并想知道为什么的人.不要在这里的行末尾添加逗号,这将导致元组,而不是字符串.;) (12认同)
  • 是不是比给定的例子更明确地添加+字符?我仍然认为这是隐含的.即`"str1"+"str2"`而不是"str1""str2"` (5认同)
  • +1:"就我个人而言,我不喜欢反斜杠,我记得在某处读到它的使用实际上已被弃用,而这种形式更为明确.请记住"明确比隐含更好." (4认同)
  • 我实际上同意加号更明确,但它做了不同的事情.它将字符串转换为要计算的表达式,而不是在多个部分中指定单个字符串常量.我不确定,但我认为这是在解析期间完成的,而表达式需要稍后执行.除非有大量的速度差异,否则速度差异可能微不足道.但从美学角度来说,我更喜欢自动连接,因为它每行都是一个不那么杂乱的角色. (2认同)
  • 这种语法还保留了应用字符串格式的可能性,例如:``('这是我真的,​​真的,真的,真的,真的很长的{}''我真的,真的,真的很想{}')。格式(var1,var2)) (2认同)
  • 警告:如果多行字符串是多行格式化字符串,且以“f”开头,则“f”需要出现在每一行上。 (2认同)

Mic*_*unn 103

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

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."
Run Code Online (Sandbox Code Playgroud)

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

  • 这是通过转义终止线而不仅仅是隐式连接,直到最近在PEP8中明确禁止的行继续,尽管现在有一个余量,但不是长字符串.托德在下面的回答是正确的. (6认同)
  • 这就是为什么我觉得这个问题是个白痴.干杯. (4认同)
  • 我喜欢PEP8,但这是我不喜欢的PEP8的一部分.我觉得隐含的延续更清晰,因为有可能与元组混淆 (3认同)
  • 记住\后面不要加空格 (2认同)

Zom*_*eep 15

我认为你问题中最重要的一个词是"建议".

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

对不起,这不能直接回答你的问题.

  • 我自己知道,我倾向于坚持 80 个字符的限制,因为我仍然在 IDLE 中完成大部分编码,而且我不喜欢它处理水平滚动的方式。(无滚动条) (2认同)

ret*_*ile 12

你失去了一个空间,你可能需要一个续行字符,即.a \.

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."
Run Code Online (Sandbox Code Playgroud)

甚至:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."
Run Code Online (Sandbox Code Playgroud)

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

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

与:

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

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


ger*_*rit 6

如果你必须插入一个长字符串文字并希望 flake8 关闭,你可以使用它的shutdown 指令。例如,在测试例程中,我定义了一些假的 CSV 输入。我发现将其拆分为更多行会非常混乱,因此我决定添加 a ,# 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
Run Code Online (Sandbox Code Playgroud)