我知道行宽的标准Python约定是79个字符。我知道可以通过多种方式继续行,例如自动字符串连接,括号和反斜杠。似乎没有明确定义的是如何应该格式化溢出文本。我是否一直将它推回到第1组?到原始线开始的col?到括号的开头(如果适用)?例如,假设我有这样的事情:
self.someLongAttributeName = {'someLongKeyName':'someLongValueName',
'anotherLongKeyName':'anotherLongValueName'}
假设我上面使用的格式符合79个字符的限制,第二行的缩进是否正确?
现在假设如上所示的第一行是> 79个字符。在这种情况下应该怎么看?
注意:我知道很多人不同意79个字符的约定。虽然我尊重问题的每一方都有很多利弊,但这次辩论与我的问题无关。我问如何遵守惯例,而不是我是否应该遵守,所以请不要在回复中支持放弃它的好处。谢谢。 =)
答案 0 :(得分:11)
假设我上面使用的格式符合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
)
答案 1 :(得分:5)
http://www.python.org/dev/peps/pep-0008/
见Maximum Line Length
将所有行限制为最多79行 字符。
周围仍有很多设备 限制为80个字符 线;另外,将窗口限制为80 人物可以拥有 几个窗口并排。该 默认包装在这些设备上 破坏了视觉结构 代码,使其更难 了解。因此,请限制 所有行最多为79 字符。用于流动长块 文本(docstrings或comments), 将长度限制为72个字符 推荐。
长包裹的首选方式 线是通过使用Pythons暗示线 在括号内继续, 括号和大括号。如有必要, 你可以添加一对 围绕表达的括号,但是 有时使用反斜杠看起来 更好。确保缩进 适当地继续排队。该 打破一个首选的地方 二元运算符是 在运营商之后,而不是之前。一些例子:
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)
答案 2 :(得分:3)
即使超越了Python,我也会一直为我的C代码执行此操作,因此我可以(正如PEP所说)在监视器上并排打开2-3个文件并查看它们。
反斜杠运算符\
在Python和C中用作行继续运算符,但我更喜欢尝试使用括号()
或大括号{}
(或括号{}对行进行分组{1}}对于Python列表),无论什么是最方便的。如果我决定在一个持续时间很长的区块中添加另一条线,我不想担心任何愚蠢的“陷阱”:错过[]
或更糟糕的是,在{{1}之后有一些错误的空间使连续失效。
对于长条件,我喜欢双缩进,因此更明显的是该代码不是新块的一部分。
\
答案 3 :(得分:2)
在PEP 8中有一个例子:
class Rectangle(Blob):
def __init__(self, width, height,
# more code
Blob.__init__(self, width, height,
color, emphasis, highlight)
在我看来,这表明你的榜样是正确的。我认为你应该在打开括号({
)之后打破示例的第一行,如下所示:
self.someLongAttributeName = {
'someLongKeyName':'someLongValueName',
'anotherLongKeyName':'anotherLongValueName'
}
如果太长了。我不知道它是否是'pythonic',但应该是熟悉和可读的。
答案 4 :(得分:1)
长包裹的首选方式 line是使用Python的暗示 线 在括号,括号和括号内继续。如有必要, 您 可以在表达式周围添加一对额外的括号,但是 有时 使用反斜杠看起来更好。确保缩进续行 适当。打破二进制文件的首选位置 运营商是 在运营商之后,而不是之前。
答案 5 :(得分:0)
我很确定之前已经回答了这个问题,但我现在找不到它了。
简短的回答是PEP8没有涵盖如何格式化对象文字,除了冒号之前应该有零空格而后面有一个空格。
我是这样做的:
obj = {
'foo': 1,
'bar': 2,
'bas': 3,
}
答案 6 :(得分:0)
好的伎俩也是这样做的:
my_long_string="""
This are
many lines of text
"""
a = [a in my_long_string.split() if a]
有些人喜欢在打开三重引号后使用\而不过滤空行,但我真的很讨厌那些野兽。
对于您的特定示例,我同意cji。