【问题标题】:Multiline If statement with a single conditional带有单个条件的多行 If 语句
【发布时间】:2021-10-08 16:23:26
【问题描述】:

假设我有两个变量

self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication 

self.SuperLongSpecificCorperateVariableNameIcantChangeControl 

我需要比较它们。

问题在于,当我将它们都放在 if 语句中时,它会超出样式检查器的行长。

if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication != self.SuperLongSpecificCorperateVariableNameIcantChangeControl):

解决方法是将其分成两行。

if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication \
    != self.SuperLongSpecificCorperateVariableNameIcantChangeControl):

我的同事对 PEP 8 是否让您在条件之间进行拆分,或者您是否可以拆分条件本身存在分歧。理想情况下,我们会获得批准更改变量名称,但与此同时,PEP 8 说在这种情况下我们应该做什么?

【问题讨论】:

  • 明确拆分,更易阅读
  • 你不需要反斜杠。括号就足够了。
  • 我没有发现拆分它有任何问题
  • 布莱克怎么说?

标签: python pep8


【解决方案1】:

根据PEP8

包装长行的首选方法是使用 Python 的隐含 圆括号、方括号和大括号内的行继续。 排长队 可以通过将表达式包装在多行中 括号。这些应该使用优先使用反斜杠 用于续行。

还有一个关于multiline if-statements 的讨论,它不采取明确的立场,但建议在条件的续行中添加缩进级别。

最后,Should a Line Break Before or After a Binary Operator? 建议在 运算符之前中断(就像您所做的那样)。所以你可以写:

if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
        != self.SuperLongSpecificCorperateVariableNameIcantChangeControl):
    pass

但是 Python 中的变量只是名称——一种引用对象的方式。名称可以更改。可以避免换行:

communication = self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication 
control = self.SuperLongSpecificCorperateVariableNameIcantChangeControl 

if communication != control:
    pass

【讨论】:

    【解决方案2】:

    首先,PEP 8 说你可以在Maximum Line Length 下拆分长行:

    通过将表达式括在括号中,可以将长行分成多行。应该优先使用这些,而不是使用反斜杠来续行。

    事实上,由于括号,您的示例中不需要反斜杠。


    PEP 8 说您可以在 multiline if-statements 下拆分条件,尽管该部分的主要重点是如何将其与以下块区分开来。

    if-statement 的条件部分足够长以至于需要将其写成多行时,值得注意的是两个字符的关键字(即if)加上一个空格的组合,加上一个左括号为多行条件的后续行创建一个自然的 4 空格缩进。这可能会与嵌套在if-statement 中的缩进代码套件产生视觉冲突,该代码也自然缩进为 4 个空格。这个 PEP 没有明确说明如何(或是否)进一步在视觉上将这些条件行与if-语句中的嵌套套件区分开来。在这种情况下可接受的选项包括但不限于:

    # No extra indentation.
    if (this_is_one_thing and
        that_is_another_thing):
        do_something()
    
    # Add a comment, which will provide some distinction in editors
    # supporting syntax highlighting.
    if (this_is_one_thing and
        that_is_another_thing):
        # Since both conditions are true, we can frobnicate.
        do_something()
    
    # Add some extra indentation on the conditional continuation line.
    if (this_is_one_thing
            and that_is_another_thing):
        do_something()
    

    就个人而言,我会选择最后一个选项以获得最大的可读性。所以这给了我们:

    if (self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
            != self.SuperLongSpecificCorperateVariableNameIcantChangeControl):
        do_something()
    

    其他选项

    您可以使用临时“内部使用”名称来缩短行:

    _Comm = self.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
    _Control = self.SuperLongSpecificCorperateVariableNameIcantChangeControl
    if _Comm != _Control:
        do_something()
    

    这是假设上下文不在本地范围内。如果它实际上在本地范围内,则不需要“内部使用”。


    您可以使用辅助函数在本地范围内为它们提供更短的名称。由于它们是属性,因此您可以传入它们的对象:

    def _compare(instance):
        a = instance.SuperLongSpecificCorperateVariableNameIcantChangeCommunication
        b = instance.SuperLongSpecificCorperateVariableNameIcantChangeControl
        return a != b
    
    if _compare(self):
        do_something()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2020-01-20
      • 2013-05-13
      • 2011-07-12
      • 1970-01-01
      • 2014-10-20
      • 2013-12-17
      相关资源
      最近更新 更多