0

我将 PyDev 与 Eclipse 一起使用,并且我有一些仅在运行时设置的属性。通常我可以像这样修复 PyDev 的错误:

obj.runtime_attr  # @UndefinedVariable

然而,由于我的陈述很长,因此,对于 PEP8,多行,它看起来像这样:

some.long.statement.\
with.multiline(obj.runtime_attr).\
more()

现在我无法添加@UndefinedVariable,因为它会中断行继续(PEP8 要求行尾注释前有两个空格)。但是,我不能把它放在行尾(它只是不起作用):

some.long.statement.\
with.multiline(obj.runtime_attr).\
more()  # @UndefinedVariable

有什么方法可以让我忽略吗?这只是一个缺少的功能,您无法做到这一点吗?

4

1 回答 1

0

首先,请记住PEP 8 最重要的规则是:

但最重要的是:知道何时不一致——有时风格指南并不适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。

它特别说要避免规则:

应用规则会使代码的可读性降低,即使对于习惯于阅读遵循规则的代码的人也是如此。

话虽这么说,你已经违反了 PEP 8 的文字和精神,只是拥有这些代码行,除非你不能避免它而不使事情变得更糟。正如最大行长度所说,使用反斜杠延续是处理长行的最不受欢迎的方法。最重要的是,它特别指出“确保适当缩进续行”,您没有这样做。


打破这种情况的明显方法是使用一些中间变量。这不是 C++;无需担心“复制构造函数”成本。在现实生活中的示例中(与这个玩具示例不同),您可能会想出一些好名字,它们比它们替换的长表达式更有意义。

intermediate = some.long.statement
multiline = intermediate.with.multiline(obj.runtime_attr)
more = multiline.more()

如果这不合适,正如 PEP 8 明确指出的那样,最好依赖括号延续而不是反斜杠延续。在这里可行吗?当然:

some.long.statement.with.multiline(
    obj.runtime_attr).more()

或者,如果最坏的情况发生在最坏的情况下:

(some.long.statement.
 with.multiline(obj.runtime_attr).more())

这有时会使事情的可读性降低而不是提高,在这种情况下你不应该这样做。但这始终是一种选择。而且,如果您必须竭尽全力使反斜杠继续为您工作,那么它可能会比过度括号化的最严重的过度行为更糟糕。


无论如何,以这两种方式中的任何一种都意味着您可以在每一行的末尾添加注释,这样您的问题就不会首先出现。

于 2013-07-02T22:18:43.953 回答