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

时间:2011-12-24 20:56:58

标签: python string formatting line-endings correctness

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

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

此返回语句是否被认为是一行代码行?因为我最初认为“\”是为了提高可读性和避免环绕而将那些看似过长的线分成两部分。

另外,我这里的表格反映了我的代码中的内容。表示'(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)

在这一个中没有涉及“\”......

6 个答案:

答案 0 :(得分:6)

%符号称为字符串格式字符串插值运算符,在String Formatting Operations中有所描述。另请注意,在我的示例中,我将%符号移动到下一行,而不是将其留在上一行的末尾。这两种形式都是有效的,但是将它放在同一行,因为用于插值的数据往往使它更易于阅读和更容易维护。

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

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

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

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

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

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

  

括号,方括号或花括号中的表达式可以是   在不使用反斜杠的情况下拆分多个物理行。

总结...... 请尽可能避免使用反斜杠明确加入行! (考虑到替代方案,它几乎是永远>。)

显式/隐式线连接的相关主题是使用String Literals部分中讨论的三引号字符串。鉴于吉他示例的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)

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

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

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)

答案 1 :(得分:3)

是的,行末尾的\会转义换行符,因此这两段代码是等效的。

此处描述:http://docs.python.org/reference/lexical_analysis.html#explicit-line-joining

答案 2 :(得分:1)

是的,你所拥有的是一条简单的字符串格式,分为两行。反斜杠操作符只允许您将python语句分解为多行(因为Python对空白敏感)。

答案 3 :(得分:1)

反斜杠字符使python忽略第一行末尾的换行符(参见the docs)。所以是的,你的两段代码确实是等价的。

答案 4 :(得分:1)

  

因为我最初认为“\”是为了提高可读性和避免环绕而将那些似乎过长的线分成两部分。

是的。你觉得什么令人困惑?

在该行连接后,您只需获得一个长字符串,后跟一个%后跟一个元组。这具有通常的含义; %用于字符串插值。

答案 5 :(得分:1)

在用IDLE打开的脚本中,我在以下函数的主体中获得了以下缩进:

def f(self, a, b, c, d, e, f):
    return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \
           (self.id, a, b, c, d, e, f)

要获得此缩进,请将光标放在(%.02f, %.02f, %.02f) }' % \(self.id, a, b, c, d, e, f)之间,然后单击ENTER

如果我复制,在SO上,只有上面函数体的两行,而没有点击 {} 按钮,我获得:

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

aculich的回答中的缩进是正确的,你问题中的缩进是不正确的(因为你的代码可以正常工作而不会出错)但是视觉上并不愉快。

就个人而言,我认为最好将操作符号放在\之后的行上而不是之前,如下所示:

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

可以改善显示效果,以便减小宽度,如下所示:

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

Bouaif(这是个人法语拟声词试图表达怀疑),这并不奇妙,因为它混合了隐式和显式的连接线。

编辑:那么,考虑到aculich的解释,上面的宽度减小的解决方案也可以写成

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

嗯,这有更多的风格。

但我在后一种方式和以下方式中犹豫了解哪一个我更喜欢 在考虑所有这一切时,我想到了这一点:

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