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



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

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 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % (self.id, a, b, c, d, e, f)

在这个中,不涉及"\"。

> %符号称为字符串格式或字符串内插运算符,在字符串格式设置操作中进行了介绍。另外,请注意,在我的示例中,我将%符号移动到下一行,而不是将其保留在上一行的末尾。这两种形式都是有效的,但是将其与用于插值的数据放在同一行上往往会使其更清晰易读且更易于维护。

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

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))

尝试用反斜杠做同样的事情...它不仅更加艰巨,而且您也不能使用注释。

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

括号

、方括号或大括号中的表达式可以是 拆分为多个物理行,不使用反斜杠。

综上所述...请尽可能避免使用反斜杠进行显式行连接!(考虑到替代方案,几乎从来都没有必要(。

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

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

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

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

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

因为我最初认为"\"是为了将看似过长的行切成两部分,以增强可读性并避免环绕。

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

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

在用 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)

相关内容

  • 没有找到相关文章

最新更新