如何正确换行以符合PEP8规范?

17 投票
3 回答
14999 浏览
提问于 2025-04-16 17:15

给定这个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"
        )

撰写回答