[英]Python string literal concatenation
我可以使用以下语法创建一个多行字符串:
string = str("Some chars "
"Some more chars")
这将产生以下字符串:
"Some chars Some more chars"
Python 是将这两个单独的字符串连接起来还是编辑器/编译器将它们视为单个字符串?
Ps:我只是想了解内部。 我知道还有其他方法可以声明或创建多行字符串。
阅读参考手册,它在那里。 具体来说:
允许多个相邻的字符串或字节文字(由空格分隔),可能使用不同的引用约定,它们的含义与其连接相同。 因此,“hello”'world' 等价于“helloworld”。 此功能可用于减少所需的反斜杠数量,方便地跨长行拆分长字符串,甚至为字符串的某些部分添加注释,
(强调我的)
这就是为什么:
string = str("Some chars "
"Some more chars")
与: str("Some chars Some more chars")
完全相同。
此操作在可能出现字符串文字、列表初始化、函数调用(如上述str
的情况)等的任何地方执行。
唯一的警告是当字符串文字不包含在分组分隔符()
、 {}
或[]
之间,而是在两个单独的物理行之间传播时。 在这种情况下,我们也可以使用反斜杠字符连接这些行并获得相同的结果:
string = "Some chars " \
"Some more chars"
当然,同一物理行上的字符串连接不需要反斜杠。 ( string = "Hello " "World"
就好了)
Python 是将这两个单独的字符串连接起来还是编辑器/编译器将它们视为单个字符串?
Python是,现在当究竟蟒蛇做,这是事情变得有趣。
从我可以收集到的(用一点点盐,我不是解析专家),当 Python 将给定表达式的解析树( LL(1)
Parser )转换为它对应的 AST (抽象语法树)时,就会发生这种情况) 。
您可以通过parser
模块获得解析树的视图:
import parser
expr = """
str("Hello "
"World")
"""
pexpr = parser.expr(expr)
parser.st2list(pexpr)
这会转储一个非常大且令人困惑的列表,该列表表示从expr
的表达式解析的具体语法树:
-- rest snipped for brevity --
[322,
[323,
[3, '"hello"'],
[3, '"world"']]]]]]]]]]]]]]]]]],
-- rest snipped for brevity --
所述编号对应于解析树任一符号或令牌和映射从符号到语法规则和令牌至恒是在Lib/symbol.py
和Lib/token.py
分别。
正如您在我添加的剪辑版本中看到的那样,您有两个不同的条目对应于解析的表达式中的两个不同的str
文字。
接下来,我们可以通过标准库中提供的ast
模块查看上一个表达式生成的 AST 树的输出:
p = ast.parse(expr)
ast.dump(p)
# this prints out the following:
"Module(body = [Expr(value = Call(func = Name(id = 'str', ctx = Load()), args = [Str(s = 'hello world')], keywords = []))])"
在这种情况下,输出对用户更加友好; 您可以看到函数调用的args
是单个串联字符串Hello World
。
此外,我还偶然发现了一个很酷的模块,它可以为ast
节点生成树的可视化。 使用它,表达式expr
的输出可视化如下:
裁剪图像以仅显示表达式的相关部分。
如您所见,在终端叶节点中,我们有一个str
对象,即"Hello "
和"World"
的连接字符串,即"Hello World"
。
如果你觉得足够勇敢,请深入研究源代码,将表达式转换为解析树的源代码位于Parser/pgen.c
而将解析树转换为抽象语法树的代码位于Python/ast.c
。
此信息适用于Python 3.5
,我很确定除非您使用的是一些非常旧的版本( < 2.5
),否则功能和位置应该相似。
此外,如果您对 python 遵循的整个编译步骤感兴趣,核心贡献者之一 Brett Cannon 在视频From Source to Code: How CPython's Compiler Works 中提供了一个很好的温和介绍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.