【问题标题】:How would you properly break this line to match pep8 rules?您将如何正确打破这条线以匹配 pep8 规则?
【发布时间】:2011-08-21 08:07:03
【问题描述】:

给定这个 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 的行长规则。

立即想到的是,我可以在类之外定义小部件和标签,然后在类定义中使用它们,但这感觉很不符合 Python 风格。

【问题讨论】:

  • blah_blah_costCharfield?
  • 是的 - 这是业务规则的一部分 - 它用于显示。我知道这听起来很奇怪,但这与我提出的问题并不真正相关。
  • PEP 8 并没有说是好是坏。但是,如果您想教条地遵循它,则可以对过长的参数使用“解释”变量。 (虽然这对于字符串常量来说似乎有些愚蠢。)

标签: python pep8


【解决方案1】:

我同意对续行使用双(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")

【讨论】:

  • choices=CATEGORY_VALUE), 一个缩进凸起,因为它是一个嵌套参数?无论如何,一个干净的方法。
【解决方案2】:

您已经知道可以在括号内以逗号分隔一行。您知道吗,您始终可以使用反斜杠-换行符组合来分割无法分割的行?:

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 个字符的行。

【讨论】:

  • 感谢您的出色回复 - 太糟糕了,我无法将两个回复标记为答案。
  • -1。使用反斜杠转义换行符很容易出现不可见的尾随空白错误。并且通过在开括号处不中断,您的连续行会缩进大量,并且该数量不必要地与第一行的长度相关联。最好在左括号处中断,缩进标准数量(8 或 4 列),在该缩进处排列所有参数,并且根本不使用反斜杠继续。
【解决方案3】:

我不认为 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"
        )

【讨论】:

  • 这是有道理的。感谢您的回答!
  • PEP8 确实在此 a bit 上说过。简而言之,一切都或多或少类似于这个答案,但是不需要双(8 空格)缩进,并且在最后一个参数之后将结束括号留在行上。 (恕我直言,如果最后一个参数后有逗号,则可以在下一行使用右括号,除非它以 scatter 运算符开头。)
  • js 风格。我喜欢!
  • 我不明白这种风格的原因,它似乎适用于所有语言。如果缩进已经是 4,那么将它加倍到 8 有什么用?
  • @dtc 我喜欢额外的缩进使它看起来与普通的缩进代码块不同
猜你喜欢
  • 2018-01-02
  • 2011-01-04
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多