如何优雅地打破长串

时间:2013-12-04 05:12:53

标签: python implicit pep continuation long-lines

看,我已经看到本网站提供的许多答案涉及我的问题的各个方面。 [上述]答案通常提供已经存在的例子,这些例子过于基本无济于事 - 至少对我而言。但是,嘿,也许我过于复杂了。

这是原始的长线:

    for i in range(2, l + 1):
        job_count_array["//form[@id='SubAvailSelectForm']/font/table[2]/tbody/tr[%d]/td[1]/small" % i] = sel.get_text("//form[@id='SubAvailSelectForm']/font/table[2]/tbody/tr[%d]/td[1]/small" % i)

这是我尝试实施'长线延续'礼仪(2007年发现的pycon讲义,我发现here):

    for i in range(2, l + 1):
        job_count_array["//form[@id='SubAvailSelectForm']/font/table[2]/ \
                        tbody/tr[%d]/td[1]/small" % i] = sel.get_text("/ \
                        /form[@id='SubAvailSelectForm']/font/table[2]/tb \
                        ody/tr[%d]/td[1]/small" % i)

我的尝试(a)是否会被解析器正确解释和/或(b)被任何有用的贡献者更加“漂亮”或高效?谢谢。

1 个答案:

答案 0 :(得分:4)

我会选择以下两种选择之一:

for i in range(2, l + 1):
    replace_index = "//form[@id='SubAvailSelectForm']/font/table[2]/tbody/tr[%d]/td[1]/small" % (i,)
    job_count_array[replace_index] = sel.get_text(replace_index)

首先,您使用两次相同的长字符串,因此请在其位置使用replace_index。这使得代码更短,并且保证您不会在两者之间有任何小的,难以识别的拼写错误。

for i in range(2, l + 1):
    replace_index = ("//form[@id='SubAvailSelectForm']/"
                     "font/table[2]/tbody/tr[%d]/td[1]/small") % (i,)
    job_count_array[replace_index] = sel.get_text(replace_index)

其次,您可以使用“括号内的字符串自动连接”技巧,而不是字符串转义的行尾。我觉得这样阅读起来容易得多。

另外值得注意的是使用(%i,)代替%i进行字符串格式化。事实证明,在我的过去,将单个字符串格式化参数设置为元组是有益的,因此将来更容易添加其他参数,而且在如何呈现字符串格式化参数方面也很好。