1

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

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)

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

4

6 回答 6

6

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

是的,这两段代码是等效的,因为反斜杠将两个或多个物理行视为单个逻辑行,如 Python 文档中关于Explicit 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))

尝试用反斜杠做同样的事情……不仅更费力,而且你也不能使用注释。

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

括号、方括号或花括号中的表达式可以在多个物理行上拆分,而无需使用反斜杠。

总之......请尽可能避免使用反斜杠进行显式行连接!(考虑到替代方案,几乎从不需要)。

显式/隐式行连接的一个相关主题是使用三引号字符串,在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)
于 2011-12-25T00:49:24.700 回答
3

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

它在这里描述:http: //docs.python.org/reference/lexical_analysis.html#explicit-line-joining

于 2011-12-24T20:58:30.320 回答
1

是的,您所拥有的是一个简单的字符串格式,分为两行。反斜杠运算符仅允许您将 python 语句分成多行(因为 Python 对空格敏感)。

于 2011-12-24T21:00:52.910 回答
1

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

于 2011-12-24T21:01:31.343 回答
1

因为我最初认为“\”是为了将似乎过长的行分成两部分,以提高可读性并避免回绕。

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

将行连接起来后,您只会得到一个长字符串,%后跟一个元组。这具有通常的含义;%用于字符串插值。

于 2011-12-24T22:19:43.807 回答
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

如果我在这里复制,只复制上述函数 body 的两行,而不点击{}按钮,我得到:

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)
于 2011-12-26T12:49:02.073 回答