我知道Python代码应该限制在79列,但如何缩进行续呢?
我知道在Python中,标准的行宽限制是79个字符。我也知道可以通过几种方式来换行,比如自动连接字符串、使用括号和反斜杠。不过,关于溢出文本应该怎么格式化,这一点似乎没有明确的规定。我应该把它缩进到第一列吗?还是缩进到原始行的起始位置?或者是括号的起始位置(如果有的话)?举个例子,如果我有这样的代码:
self.someLongAttributeName = {'someLongKeyName':'someLongValueName',
'anotherLongKeyName':'anotherLongValueName'}
假设我上面用的格式符合79个字符的限制,那么第二行的缩进是正确的吗?
现在假设上面显示的第一行超过了79个字符,那这种情况下应该怎么处理呢?
注意:我知道很多人对79个字符的限制有不同的看法。虽然我尊重每种观点都有其优缺点,但这个争论和我的问题无关。我想知道的是如何遵循这个规范,而不是我是否应该遵循,所以请不要在回复中讨论放弃这个规范的好处。谢谢。=)
7 个回答
不仅仅是在Python中,我在写C代码的时候也经常这样做,这样我就可以像PEP所说的那样,在一个显示器上并排打开2到3个文件,方便查看。
在Python和C中,反斜杠符号\
可以用来表示代码行的延续,但我更喜欢用括号()
、大括号{}
(或者在Python列表中用方括号[]
)来把代码行分组,这样更方便。如果我决定在一个长的代码块中间添加另一行,我就不想担心一些小问题,比如漏掉了一个\
,或者更糟糕的是,在\
后面多了一个空格,这样就会导致延续失效。
对于长的条件语句,我喜欢使用双缩进,这样可以更明显地看出这段代码不是新代码块的一部分。
if (somethingLong == x or
somethingElse == y or
somethingOld == z or
x < y < z or
doIt.now()):
pass
http://www.python.org/dev/peps/pep-0008/
查看 最大行长度
所有行的长度都要限制在最多79个字符。
现在还有很多设备只能显示80个字符的行;而且,把窗口限制在80个字符内,可以让多个窗口并排显示。这样做可以避免代码的视觉结构被打乱,让理解代码变得更容易。因此,请将所有行的长度限制在最多79个字符。对于长文本块(比如文档字符串或注释),建议将长度限制在72个字符。
处理长行的推荐方式是使用Python的隐式行继续,通常是在括号、方括号和大括号内。如果需要,你可以在表达式周围加一对额外的括号,但有时候使用反斜杠会看起来更好。确保继续的行缩进得当。对于二元运算符,最好在运算符之后断行,而不是之前。以下是一些示例:
class Rectangle(Blob):
def __init__(self, width, height,
color='black', emphasis=None, highlight=0):
if width == 0 and height == 0 and \
color == 'red' and emphasis == 'strong' or \
highlight > 100:
raise ValueError("sorry, you lose")
if width == 0 and height == 0 and (color == 'red' or
emphasis is None):
raise ValueError("I don't think so -- values are %s, %s" %
(width, height))
Blob.__init__(self, width, height,
color, emphasis, highlight)
假设我上面使用的格式符合79个字符的限制,那么第二行的缩进是正确的吗?
是的,这就是PEP 8在示例中展示的方式:
class Rectangle(Blob):
def __init__(self, width, height,
color='black', emphasis=None, highlight=0):
if width == 0 and height == 0 and \
color == 'red' and emphasis == 'strong' or \
highlight > 100:
raise ValueError("sorry, you lose")
if width == 0 and height == 0 and (color == 'red' or
emphasis is None):
raise ValueError("I don't think so -- values are %s, %s" %
(width, height))
Blob.__init__(self, width, height,
color, emphasis, highlight)
但是当开括号或大括号已经接近第79列时,我通常会这样处理:
Two good reasons to break a particular rule:
(1) When applying the rule would make the code less readable, even for
someone who is used to reading code that follows the rules.
[...]
然后做类似这样的事情
self.some_long_attribute_name = {
'someLongKeyName': 'someLongValueName',
'anotherLongKeyName': 'anotherLongValueName'
}
或者
long_object_name.do_something_with_long_name(
long_expression_returning_is_first_arg,
long_expression_returning_is_second_arg
)