Python风格-字符串的行连接?

180

为了遵守Python的编码规则,我将我的编辑器设置为最大79列。

在PEP中,建议使用Python括号、圆括号和大括号中的隐式续行。然而,在处理字符串时,当我达到列限制时,情况就有些奇怪了。

例如,尝试使用多行

mystr = """Why, hello there
wonderful stackoverflow people!"""

将返回

"Why, hello there\nwonderful stackoverflow people!"
这有效:
mystr = "Why, hello there \
wonderful stackoverflow people!"

由于它返回这个:

"Why, hello there wonderful stackoverflow people!"

然而,当语句缩进了几个块时,这看起来很奇怪:

do stuff:
    and more stuff:
        and even some more stuff:
            mystr = "Why, hello there \
wonderful stackoverflow people!"

如果您尝试缩进第二行:

do stuff:
    and more stuff:
        and even some more stuff:
            mystr = "Why, hello there \
            wonderful stackoverflow people!"

你的字符串最终变成:

"Why, hello there                wonderful stackoverflow people!"

我找到的唯一解决方法是:

do stuff:
    and more stuff:
        and even some more stuff:
            mystr = "Why, hello there" \
            "wonderful stackoverflow people!"

我更喜欢这种方式,但它的视觉效果有些不舒服,因为看起来像是有一个字符串就悬浮在那里。下面是正确的输出结果:

"Why, hello there wonderful stackoverflow people!"

所以,我的问题是 - 一些人对如何做这件事有什么建议,并且是否有样式指南中我应该遵循的内容被忽略了?

谢谢。


6
我缩进这么多是为了说明一个观点。但请注意,至少达到三级缩进非常容易,但情况仍然存在,即即使只进行一级缩进,标准方法仍会使字符串大幅偏离位置。 - sjmh
5个回答

278

2
谢谢Sven,我比之前用的风格更喜欢这个。 - sjmh
2
我以为这只是一个技巧,但在阅读Python文档之后,不得不说,这很棒。谢谢! - user
问题在于当赋值给一个变量时,这种形式看起来太像元组了。如果在字符串之间添加逗号,它就成为了一个包含两个字符串的元组。 - Eric
简单,优雅 - matanster
有没有特定的原因将空格放在第一行而不是第二行? - Stevoisiak
@Stevoisiak 那绝对是我的首选,但我猜两种方式都可以。 - Sven Marnach

54

只是指出使用括号会自动连接。如果您已经在语句中使用它们,那么这很好。否则,我会使用'\'而不是插入括号(这是大多数IDE自动为您完成的)。缩进应该对齐字符串的续行,以符合PEP8标准。例如:

my_string = "The quick brown dog " \
            "jumped over the lazy fox"

6
这是一个非常干净的方法:
myStr = ("firstPartOfMyString"+
         "secondPartOfMyString"+
         "thirdPartOfMyString")

在所有的解决方案中,这一个看起来是唯一能够在为函数按名称赋值时正常工作的。也就是说,foo(text=("bar" + "baz"))。所以,我投了赞成票。 - cycollins

4

另一种可能性是使用textwrap模块。这也避免了问题“字符串就这样孤零零地存在于中间”,正如问题中提到的那样。

import textwrap
mystr = """\
        Why, hello there
        wonderful stackoverfow people"""
print (textwrap.fill(textwrap.dedent(mystr)))

-2

我已经通过这种方式解决了问题。

mystr = ' '.join(
        ["Why, hello there",
         "wonderful stackoverflow people!"])

过去的做法并不完美,但对于需要不换行的非常长的字符串来说,它运行得很好。


19
在我的机器上,这需要350纳秒,使用元组而不是列表连接需要250纳秒。 另一方面,隐式连接仅需要25纳秒。 隐式连接在简单性和速度方面都是明显的优胜者。 - endolith
9
我同意使用括号更好,因为这样更简洁,但这并不是考虑性能的地方。如果你关心运行时差异在100纳秒左右,尤其是在连接硬编码字符串时,那么肯定出了问题。 - nmichaels
4
这篇文章讨论的是如何将手写代码格式化以便人类理解。如果你做了一百万次这样的操作,那么你肯定是在错误地进行操作。一百万(10^6)次100纳秒(10^-9)等于100毫秒(10^-3)。100纳秒非常短暂,即使将其乘以一百万,得到的结果也不会让您太在意。正如我所说,使用(好的)被接受的答案,但为此类操作引入性能问题是荒谬的。 - nmichaels
2
@buffer:你看到这个是手写的事情了吗?那就是上下文。 - nmichaels
3
@osa 真的吗?这个论点太糟糕了。 100毫秒是做一百万次这件事情所需的额外时间。 我们仍然在谈论为了可读性而连接手写字符串。性能在这里并不重要。我曾经做过30纳秒很重要的工作,但这不是那种情况。 - nmichaels
显示剩余3条评论

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