【问题标题】:How can I break up this long line in Python?如何在 Python 中打破这条长线?
【发布时间】:2011-01-04 18:15:25
【问题描述】:

您将如何格式化这样的长行?我希望它的宽度不超过 80 个字符:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

这是我最好的选择吗?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))

【问题讨论】:

  • 似乎是个不错的选择。你不喜欢它的什么地方?
  • 有点主观,不是吗? :)
  • 相关:stackoverflow.com/questions/1940710/…(python中的字符串连接)
  • 您可以通过删除 "it's" 中不正确的 ' 来保存字符。
  • indexesindex 的正确复数是indices

标签: python formatting code-formatting


【解决方案1】:

连续的字符串文字被编译器连接起来,括号内的表达式被认为是一行代码:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

【讨论】:

    【解决方案2】:

    我个人不喜欢悬挂开放的块,所以我将其格式化为:

    logger.info(
        'Skipping {0} because its thumbnail was already in our system as {1}.'
        .format(line[indexes['url']], video.title)
    )
    

    一般来说,我不会费力使代码完全适合 80 列的行。将行长保持在合理水平是值得的,但硬 80 限制已成为过去。

    【讨论】:

    • 这并不是真正的过去。 Python 标准库仍然使用 PEP8 作为其样式指南,因此该规则仍然存在,并且很多人(包括我自己)都遵循它。这是一个方便划线的地方。
    • 我想知道有多少项目仍然遵循 80 字符规则。对于我使用的平均窗口大小,我认为 100-120 对我来说比 80 个字符更有效率。
    • 是的,这也是我使用的行长,不过 [恐怖! sacrilege!] 我使用的是比例字体,所以确切的行长不是那么重要。这更像是单行上有多少逻辑可读而不是多少字符,因此......如果我有一长串没有人需要阅读的数据,我很乐意让它溢出120.
    • 代码的比例字体 - 我和你在一起,兄弟。但从与我共事过的每个人对他们的厌恶来看,世界还没有准备好。
    • ~80 个字符还可以更轻松地在同一屏幕上并排区分 2 个文件。此外,如果您在服务器控制台上的紧急紧急情况下调试某些东西,您将非常感谢 80 个字符的限制! :)
    【解决方案3】:

    这是一个开始。在使用它们的代码之外定义较长的字符串并不是一个坏习惯。这是一种分离数据和行为的方法。您的第一个选择是通过使它们彼此相邻来隐式地将字符串文字连接在一起:

    ("This is the first line of my text, "
    "which will be joined to a second.")
    

    或者使用行尾延续,这有点脆弱,因为这样可以:

    "This is the first line of my text, " \
    "which will be joined to a second."
    

    但这不是:

    "This is the first line of my text, " \ 
    "which will be joined to a second."
    

    看到区别了吗?不?好吧,当它是您的代码时,您也不会。

    隐式连接的缺点是它只适用于字符串文字,而不适用于从 变量,所以当你重构的时候事情会变得更加复杂。此外,您只能在整个组合字符串上插入格式。

    或者,您可以使用连接运算符 (+) 显式加入:

    ("This is the first line of my text, " + 
    "which will be joined to a second.")
    

    显式优于隐式,正如 python 的禅宗所说,但这会创建三个字符串而不是一个,并使用两倍的内存:有你写的两个,加上一个是它们中的两个连接在一起,所以你必须知道什么时候忽略禅。好处是您可以将格式应用于 每行单独的任何子字符串,或括号外的全部。

    最后,您可以使用三引号字符串:

    """This is the first line of my text
    which will be joined to a second."""
    

    这通常是我最喜欢的,尽管它的行为略有不同,因为换行符和后续行中的任何前导空格都会显示在您的最终字符串中。您可以使用转义反斜杠消除换行符。

    """This is the first line of my text \
    which will be joined to a second."""
    

    这与上述相同技术具有相同的问题,因为正确代码与错误代码的区别仅在于不可见的空格。

    哪个是“最好的”取决于你的具体情况,但答案不仅仅是审美,而是一种微妙不同的行为。

    【讨论】:

    • CPython 编译器尽可能优化了字面量操作,这意味着添加两个字符串字面量会导致字节码中只有一个字符串字面量。
    • 虽然我收到的所有答案都很有帮助,但你的答案肯定能帮助我理解所有断弦的方法。 “\”行结尾的问题是它后面有一个空格吗?
    • 我看不出这里有什么区别,但是,这主要是因为 SO 相当原始的语法着色。 (一些非常好的代码在 SO 上几乎不可读,但这只是因为它不是一种语法非常接近 C 的语言。)让你的编辑器讨厌地突出尾随空格并不罕见,因为它们很少有用(或有意) . :-)
    • @KhurshidAlam 您可以使用单引号 ' 来包含该字符串,或者转义字符串中的双引号,或者使用三重双引号 """。无论您使用单行还是多行来定义文字字符串,包含引号的带引号字符串的问题都是相同的。
    • 我的编辑器总是删除尾随空格。我建议您启用相同的设置。当然,新行上的空格仍然是字符串的一部分,所以我最终使用了+
    【解决方案4】:

    您可以使用 textwrap 模块将其分成多行

    import textwrap
    str="ABCDEFGHIJKLIMNO"
    print("\n".join(textwrap.wrap(str,8)))
    

    ABCDEFGH
    伊克利姆诺

    来自documentation

    textwrap.wrap(text[, width[, ...]])
    将单个段落包装在文本(字符串)中,因此每行最多为宽度字符长。返回输出行的列表,没有最后的换行符。

    可选关键字参数对应于TextWrapper 的实例属性,如下所述。宽度默认为70

    请参阅TextWrapper.wrap() 方法以获取有关 wrap() 行为方式的更多详细信息。

    【讨论】:

    • 这可以节省我的时间,谢谢
    【解决方案5】:

    对于也尝试在长字符串上调用 .format() 并且无法使用一些最流行的字符串包装技术而不破坏后续 .format( 调用的任何人,您可以使用 str.format("", 1, 2) 而不是 @ 987654324@。这使您可以使用任何您喜欢的技术来断开字符串。例如:

    logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
    

    可以

    logger.info(str.format(("Skipping {0} because its thumbnail was already"
    + "in our system as {1}"), line[indexes['url']], video.title))
    

    否则,唯一的可能是使用行尾延续,我个人不喜欢。

    【讨论】:

      【解决方案6】:

      无需额外加载包的解决方案:

      def split_by_len(txt: str, l: int, sep: str or None='\n') -> str or list:
          """
          txt: str text
          l: split length (symbols per split)
          sep: separate string or None for list of strs
          """
          spl_list = [txt[i * l : i * l + l] for i in range(len(txt) // l + 1)]
          return spl_list if sep==None else sep.join(spl_list)
      

      示例 1:

      print(split_by_len(txt='XXXXX', l=2, sep='\n'))
      
      XX
      XX
      X
      

      示例 2:

      print(split_by_len(txt='XXXXX', l=2, sep=' '))
      
      XX XX X
      

      示例 3:

      print(split_by_len(txt='XXXXX', l=2, sep=None))
      
      ['XX', 'XX', 'X']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 2011-02-23
        相关资源
        最近更新 更多