多行字符串的正确缩进是什么?

28 浏览
0 Comments

多行字符串的正确缩进是什么?

Python函数内多行字符串的正确缩进是什么?\n

    def method():
        string = """第一行
第二行
第三行"""

\n还是\n

    def method():
        string = """第一行
    第二行
    第三行"""

\n或者其他方式?\n在第一个例子中,字符串悬挂在函数外部看起来有点奇怪。

0
0 Comments

问题:多行字符串的正确缩进是什么?

原因:在Python中,多行字符串的缩进可能会导致输出结果出现意外的缩进。这可能会导致代码的可读性降低,以及逻辑错误的发生。

解决方法:可以使用inspect.cleandoc函数来解决多行字符串的正确缩进问题。具体操作如下:

import inspect
def method():
    string = inspect.cleandoc("""
        line one
        line two
        line three""")

使用inspect.cleandoc函数可以保持相对缩进的预期结果。如果想要保留前面的空行,可以使用textwrap.dedent函数,但这也会保留第一个换行符。

注意:对于提高代码结构清晰度,最好将逻辑代码块缩进到相关上下文中。例如,多行字符串属于变量"string"。

非常困惑为什么直到现在才有这个答案,inspect.cleandoc函数自从Python 2.6版本就已经存在了,而Python 2.6发布于2008年。这绝对是最干净的解决方法,特别是因为它不使用悬挂缩进风格,这只会浪费不必要的空间。

这个解决方案会删除前面的几行空白文本(如果有的话)。如果不希望出现这种行为,可以使用textwrap.dedent函数。

文档中的示例建议“以\结尾的方式结束第一行,以避免空行!”,这解决了上述保留第一个换行符的问题。

0
0 Comments

在Python中,有时我们需要使用多行字符串来表示一段文本。然而,如果我们直接在代码中输入这段文本,就会导致每一行都有相同的缩进,这在视觉上可能会很不美观。

为了解决这个问题,Python提供了一个名为textwrap.dedent的函数。该函数可以在源代码中正确缩进的基础上,去除文本中的缩进。这样,我们就可以在代码中使用正确的缩进来定义多行字符串,而不会影响最终的显示效果。

使用textwrap.dedent函数的示例如下:

import textwrap
def frobnicate(param):
    """ Frobnicate the scrognate param.
        The Weebly-Ruckford algorithm is employed to frobnicate
        the scrognate to within an inch of its life.
        """
    prepare_the_comfy_chair(param)
    log_message = textwrap.dedent("""\
            Prepare to frobnicate:
            Here it comes...
                Any moment now.
            And: Frobnicate!""")
    weebly(param, log_message)
    ruckford(param)

在上面的示例中,我们使用textwrap.dedent函数去除了log_message字符串中的缩进。经过处理后,log_message的值变为:

Prepare to frobnicate:
Here it comes...
    Any moment now.
And: Frobnicate!

这样,我们就可以在代码中使用正确缩进的多行字符串,而不会影响最终的显示效果。

然而,需要注意的是,textwrap.dedent函数会对字符串进行处理,这可能会导致在频繁调用的函数中出现效率问题。因此,在设计代码结构时,需要权衡使用textwrap.dedent函数的位置和频率。

为了避免频繁调用textwrap.dedent函数带来的效率问题,可以考虑将处理后的多行字符串定义为常量,而不是在每次调用函数时进行处理。这样,textwrap.dedent函数只需要运行一次,而不是每次调用函数时都运行一次。可以通过定义一个全局变量或类变量来存储处理后的字符串,然后在函数中使用这个变量来避免重复处理。

总之,使用textwrap.dedent函数可以方便地处理多行字符串的缩进问题。但在频繁调用的函数中使用该函数可能会带来效率问题,因此需要谨慎使用并考虑合适的位置和频率。

0
0 Comments

多行字符串的正确缩进问题是因为字符串中包含了换行和空格,需要进行后处理来调整缩进。如果不想进行后处理,并且字符串内容很多,可以将其单独存储在一个文本文件中。如果文本文件对应的应用程序不适用,又不想进行后处理,可以使用隐式连接字符串的方式来解决。

要对多行字符串进行后处理以去掉不需要的部分,可以考虑使用textwrap模块或者PEP 257中介绍的处理文档字符串的技术。

在代码中,使用相同缩进级别可以使文本的每一行保持对齐。但这意味着文本的每一行应该从上一行的某个特定位置开始。这种缩进方式被称为“悬挂缩进”,在PEP8中被规定用于函数定义和长的if语句,尽管在多行字符串中没有提到。个人而言,我不遵循PEP8中的这个规定,因为我强烈不喜欢悬挂缩进,它使程序的结构变得不清晰。

第二种使用自动字符串连接的方式不包含换行符,所以需要在每一行的末尾添加\n。这种方法也很不自然地插入空行(需要有"\n\n"行)。希望Python能够像bash的here document一样支持自动删除前导制表符(<<-END)。

相关用法可以在官方教程的3.1.2节("Two string literals next to each other are automatically concatenated...")和语言参考中找到。

值得注意的是,虽然隐式连接是Python不应该具有的错误特性,但这种特定用法并不难看或难以理解,并且也不容易出错。

对于第二个例子,在Python 3中需要在每一行的末尾添加尾随的\,否则会出现"unexpected indent"错误。

关于拒绝在这里使用“悬挂缩进”的评论,我表示+1...特别是因为如果将变量名从string更改为text或其他长度不同的名称,那么你现在需要更新每一行多行字符串的缩进,以使其正确对齐"""。缩进策略不应该增加以后的重构和维护的复杂性,这也是PEP在这方面的失败之一。

这是一个很好的答案,但请看一下用户的回答,以获得最简洁的解决方案。

总结起来,多行字符串的正确缩进是一个需要注意的问题。可以使用隐式连接字符串的方式来解决,也可以使用后处理方法来调整缩进。此外,还可以考虑使用相关的Python模块或技术来处理多行字符串。在实际应用中,根据个人喜好和代码风格选择合适的缩进方式。

0