这个Python语句的含义是什么?

Chu*_*sta 1 python string formatting correctness line-endings

更具体地说,我不确定彼此之后的"%"和"\"符号应该是什么意思:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \
    (self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)

难道这return语句看作是一个行代码?因为我最初认为"\"是为了提高可读性和避免环绕而将那些看似过长的线分成两部分.

另外,我这里的列表反映了我的代码中的内容.表示'(self.id,a,b,c,d,e,f)'的部分确实比return语句的开头更加标签.

基本上,该陈述相当于:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % (self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)

在这一个没有"\"涉及....

acu*_*ich 6

%符号称为字符串格式字符串插值运算符,在字符串格式化操作中进行了描述.另请注意,在我的示例中,我将%符号移动到下一行,而不是将其留在上一行的末尾.两种形式都是有效的,但是将它放在与用于插值的数据相同的行上会使得读取更清晰,更易于维护.

是的,这两段代码是等效的,因为反斜杠将两个或多个物理行视为单个逻辑行,如Python文档\中有关显式行连接部分中的符号所述.但是我会避免使用显式行连接,而是使用第三种称为隐式线连接的等效方法:

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }'
        % (self.id, a, b, c, d, e, f))
Run Code Online (Sandbox Code Playgroud)

因为它在重新格式化时不易出错,并且还允许您使用注释,例如在此重新格式化的示例中:

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' 
        % (self.id, 
           a, 
           b, 
           # c1, 
           c2, 
           d, 
           e, 
           f))
Run Code Online (Sandbox Code Playgroud)

尝试用反斜杠做同样的事情......不仅更加艰巨,而且你也不能使用评论.

请注意,返回值周围的括号并不像某些人所建议的那样多余 ; 它们允许在变量插值的上下文中使用隐式行连接(它与后面的元组分开,%后者也是隐式线连接也会发生的附加上下文):

括号,方括号或花括号中的表达式可以分割在多个物理行上,而不使用反斜杠.

总而言之...... 尽可能避免使用反斜杠明确加入行!(鉴于替代方案,几乎没有必要).

显式/隐式行连接的相关主题是使用在字符串文字部分中讨论的三引号字符串.鉴于吉他示例的C风格块语法,我希望将返回值重新格式化为多行可能是有效的,如下所示:

class c(object):
    def f(self):
        return """
guitar {
  id: %d, 
  relevant_properties: (%.02f, %.02f, %.02f),
  irrelevant_properties: (%.02f, %.02f, %.02f)
}
""" % (self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)

我已将此示例放在类方法定义的更全面的上下文中,因此格式化的外观将更清晰; 多行字符串将与缓冲区的左侧齐平,并且任何空格将在输出中逐字显示.

但请注意,上面的格式可能会引入不需要的前导或尾随换行符,因此这是我偶尔建议使用显式行连接的少数情况之一.这里的原因是消除不需要的额外换行符作为三重引用字符串给我们的增强代码可读性的权衡,因为它允许我们或多或少地看到完整节在最终输出中看到它的方式; 比较上面你会看到\在第一次出现的结尾处添加一个单个字符""":

class c(object):
    def f(self):
        return """\
guitar {
  id: %d, 
  relevant_properties: (%.02f, %.02f, %.02f),
  irrelevant_properties: (%.02f, %.02f, %.02f)
}
""" % (self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)