【问题标题】:Python style - line continuation with strings? [duplicate]Python 风格 - 用字符串续行? [复制]
【发布时间】:2011-03-25 20:12:37
【问题描述】:

为了遵守 python 样式规则,我将编辑器设置为最多 79 列。

在 PEP 中,它建议在括号、圆括号和大括号内使用 python 的隐含延续。但是,当我达到 col 限制时处理字符串时,它会变得有点奇怪。

例如,尝试使用多行

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!"

所以,我的问题是 - 有些人对如何做到这一点有什么建议,我在风格指南中是否遗漏了一些东西来说明我应该如何做到这一点?

谢谢。

【问题讨论】:

  • 我缩进了这么多来说明一点。但是要意识到至少达到第三级缩进是很容易的——但情况仍然是,即使只有一级缩进,标准方法也会使字符串非常不合适。

标签: python coding-style


【解决方案1】:

由于adjacent string literals are automatically joint into a single string,您可以按照 PEP 8 的建议在括号内使用隐含的续行:

print("Why, hello there wonderful "
      "stackoverflow people!")

【讨论】:

  • 谢谢斯文,我喜欢这个比我使用的风格更喜欢。
  • 我认为这只是一个技巧,但在阅读了 python 文档之后,我必须说,这很整洁。谢谢!
  • 问题是当赋值给一个变量时,这种形式看起来太像一个元组了。如果在字符串之间添加逗号,则它是一个包含两个字符串的元组。
  • 简单、优雅
  • 有什么特别的理由把空格放在第一行而不是第二行吗?
【解决方案2】:

只是指出使用括号会调用自动连接。如果您碰巧已经在语句中使用它们,那很好。否则,我将只使用 '\' 而不是插入括号(这是大多数 IDE 自动为您所做的)。缩进应该对齐字符串延续,所以它是 PEP8 兼容的。例如:

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

【讨论】:

    【解决方案3】:

    这是一种非常干净的方法:

    myStr = ("firstPartOfMyString"+
             "secondPartOfMyString"+
             "thirdPartOfMyString")
    

    【讨论】:

    • 在所有解决方案中,这似乎是唯一一个在按名称为函数分配参数的情况下有效的解决方案。即 foo(text=("bar" + "baz"))。所以,我投票赞成。
    【解决方案4】:

    另一种可能是使用 textwrap 模块。这也避免了问题中提到的“字符串只是坐在中间位置”的问题。

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

    【讨论】:

      【解决方案5】:

      我已经解决了这个问题

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

      过去。它并不完美,但它适用于不需要换行的很长的字符串。

      【讨论】:

      • 在我的机器上,这需要 350 ns,加入元组而不是列表需要 250 ns。另一方面,隐式连接只需要 25 ns。隐式连接在简单性和速度方面都是明显的赢家。
      • @endolith:我同意使用括号更好,因为它更干净,但这不是考虑性能的地方。如果您关心运行时大约 100 ns 的差异,尤其是在连接硬编码字符串时,那就有问题了。
      • @buffer:这是关于格式化手动编码的文本以供人类解释。如果你这样做一百万次,你就错了。一百万 (10^6) 乘以 100 ns (10^-9) 是 100 ms (10^-3)。 100 纳秒是如此之小,以至于将它乘以一百万给你的东西仍然不会花费足够长的时间,以至于你应该关心它。就像我说的,使用(好的)可接受的答案,但是为这样的事情提高性能是荒谬的。
      • @buffer:你看到这个是手写的吗?这就是上下文。
      • @osa 认真的吗?这是一个可怕的论点。 100 毫秒是完成 一百万次 所需的额外时间。我们仍在讨论连接手写字符串以提高可读性。性能在这里不是考虑因素。我已经完成了 30ns 重要的工作。这不是那个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2018-03-02
      相关资源
      最近更新 更多