如何正确换行以符合PEP8规范?
给定这个Python类,它实现了一个Django表单,我们应该如何正确地调整它,以符合PEP8的标准呢?
class MyForm(forms.Form):
categories = forms.CharField(required=False,
widget=forms.SelectMultiple(choices=CATEGORY_VALUE),
label="Categories")
additional_item_ship_cost = forms.CharField(required=False, max_length=10,
label="Additional Item Ship Cost")
具体来说,widget=和label=这两个参数的写法违反了PEP8关于行长度的规定。
我立刻想到的一个办法是,可以在类外部定义widget和label,然后在类定义中使用它们,但这样做感觉不太符合Python的风格。
3 个回答
1
你已经知道在括号内可以通过逗号来换行。你知道吗,其实你还可以使用反斜杠加换行符的组合,在那些不能直接换行的地方也能换行:
class MyForm(forms.Form):
categories = forms.CharField(required=False,
widget=forms.SelectMultiple(choices=\
CATEGORY_VALUE),
label="Categories")
additional_item_ship_cost = forms.CharField(required=False, max_length=10,
label=\
"Additional Item Ship Cost")
另外,你可能不知道,Python会把相邻的字符串连接在一起,中间的空格会被忽略,所以上面的内容可以改写成:
class MyForm(forms.Form):
categories = forms.CharField(required=False,
widget=forms.SelectMultiple(choices=CATEGORY_VALUE),
label=\
"Categories")
additional_item_ship_cost = forms.CharField(required=False, max_length=10,
label="Additional"\
" Item Ship Cost")
最后,在括号内,你可以像在逗号处一样,在点号处换行,而且你可以仅仅使用括号来获得这个能力:
class MyForm(forms.Form):
categories = forms.CharField(required=False,
widget=forms.
SelectMultiple(choices=\
CATEGORY_VALUE),
label="Categories")
additional_item_ship_cost = (forms.
CharField(required=False, max_length=10,
label="Additional "\
"Item Ship Cost"))
把这些方法结合起来,并适当地减少后面换行的缩进,你就可以避免一行超过80个字符。
4
我同意在续行中使用双倍(8个空格)缩进,因为这样可以很清楚地区分续行和代码块的缩进。我还希望缩进与第一行的长度无关;第一行的长度会随着代码的维护而变化,但这不应该导致续行的缩进也要改变。
所以,不要让续行与第一行的任何内容对齐;相反,对任何续行使用相同的相对缩进。
使用反斜杠来表示续行是有问题的(因为看不见的空格可能会影响效果),而且幸运的是,这几乎总是没必要,因为Python会在开放的括号语法中自动继续语句。在打开的括号处断开函数调用(字典在打开的大括号处,列表在打开的方括号处,等等)是我首先会想到的方法。
所以我会这样做:
class MyForm(forms.Form):
categories = forms.CharField(
required=False,
widget=forms.SelectMultiple(
choices=CATEGORY_VALUE),
label="Categories")
additional_item_ship_cost = forms.CharField(
required=False, max_length=10,
label="Additional Item Ship Cost")
22
我觉得PEP8对这个问题说得不多,但我会建议对参数使用双重缩进:
class MyForm(forms.Form):
categories = forms.CharField(
required=False,
widget=forms.SelectMultiple(choices=CATEGORY_VALUE),
label="Categories"
)
additional_item_ship_cost = forms.CharField(
required=False,
max_length=10,
label="Additional Item Ship Cost"
)