“"Different"”、"quote"、'types'在函数中?

"""Different""", "quote", 'types' in function?

我想弄清楚不同的报价类型是否在功能上有所不同。我看到有人说它偏爱 ""'',但 """ """ 呢?我用一个简单的代码对其进行了测试,以查看它是否可以工作并且确实可以。我想知道 """ triple quotes """ 是否具有定义函数参数的功能目的,或者它只是另一个可以像 ""'' 一样互换使用的引用选项?

因为我看到很多人 post 关于 ""'' 我还没有看到 post 关于 """ """''' '''在函数中使用。

我的问题是:三重引号作为参数是否有独特的用途,或者它是否可以与 ""'' 简单地互换?我认为它可能具有独特功能的原因是因为它是多行引用,我想知道它是否允许提交多行参数。我不确定这样的东西是否有用,但它可能有用。

这是一个示例,它使用我知道的所有引号类型打印出您期望的内容。

def myFun(var1="""different""",var2="quote",var3='types'):
    return var1, var2, var3

print (myFun('All','''for''','one!'))

结果:

('All', 'for', 'one!')

编辑:

在对三重引号进行更多测试后,我确实发现使用 return 与在函数中打印的工作方式有所不同。

def myFun(var1="""different""",var2="""quote""",var3='types'):
    return (var1, var2, var3)

print(myFun('This',
'''Can
Be
Multi''',
'line!'))

结果:

('This', 'Can\nBe\nMulti', 'line!')

或:

def myFun(var1="""different""",var2="""quote""",var3='types'):
    print (var1, var2, var3)

myFun('This',
'''Can
Be
Multi''',
'line!')

结果:

This Can
Be
Multi line!

来自 the docs:

String literals can be enclosed in matching single quotes (') or double quotes ("). They can also be enclosed in matching groups of three single or double quotes (these are generally referred to as triple-quoted strings). [...other rules applying identically to all string literal types omitted...]

In triple-quoted strings, unescaped newlines and quotes are allowed (and are retained), except that three unescaped quotes in a row terminate the string. (A “quote” is the character used to open the string, i.e. either ' or ".)

因此,三引号字符串文字可以跨越多行,并且可以在不使用转义序列的情况下包含文字引号,但在其他方面与用其他引用类型表示的字符串文字完全相同(包括那些使用转义序列如\n\'来表达相同内容的。

另请参阅 Python 3 文档:Bytes and String Literals -- 它表达了一组实际上相同的规则,但措辞略有不同。


language tutorial 中还提供了更温和的介绍,其中明确介绍了三引号作为允许字符串跨越多行的方式:

String literals can span multiple lines. One way is using triple-quotes: """...""" or '''...'''. End of lines are automatically included in the string, but it’s possible to prevent this by adding a \ at the end of the line. The following example:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

produces the following output (note that the initial newline is not included):

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

要清楚,虽然:这些是不同的语法,但是它们创建的字符串文字彼此没有区别。也就是说,给定如下代码:

s1 = '''foo
'bar'
baz
'''
s2 = 'foo\n\'bar\'\nbaz\n'

无法通过查看 s1s2 的值来区分它们:s1 == s2 是正确的,repr(s1) == repr(s2) 也是正确的。 Python 解释器甚至可以将它们保留为相同的值,因此它 可能 (或可能不)使 id(s1) == id(s2) 为真,具体取决于细节(例如是否代码在 REPL 中 运行 或 import 作为模块编辑)。

FWIW,我的理解是有一个约定,其中“””“””,''''''用于文档字符串,有点像#comment,但是是一个可以引用的可调用属性之后。 https://www.python.org/dev/peps/pep-0257/

我也是初学者,但我的理解是对字符串使用三重引号并不是最好的主意,即使 if 与您所做的功能差别不大目前(我不知道以后会不会)。坚持约定有助于其他人阅读和使用您的代码,这似乎是一个很好的经验法则,如果您不遵循某些约定,它们就会对您不利,例如在这种情况下,带有三重引号的格式错误的字符串将被解释为文档字符串,并且可能不会抛出错误,您需要搜索一堆代码才能找到问题所在。