有没有办法将PyDev的@UndefinedVariable放在多行语句中?

时间:2013-07-02 22:02:13

标签: python eclipse pydev

我在Eclipse中使用PyDev,并且我有一些仅在运行时设置的属性。通常我可以像这样解决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

有什么方法可以解决这个问题吗?这只是一个缺失的功能,你不能正确吗?

1 个答案:

答案 0 :(得分:0)

首先,请记住the most important rule of PEP 8是:

  

但最重要的是:知道何时不一致 - 有时风格指南不适用。如有疑问,请使用您的最佳判断。查看其他示例并确定最佳效果。

它特别指出要避免一条规则:

  

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

话虽如此,你已经违反了PEP 8的字母和精神,只要拥有这些代码,除非你不能避免它而不会让事情变得更糟。正如Maximum Line Length所说,使用反斜杠延续是处理长行的最不优选的方法。最重要的是,它特别说“确保适当地缩进续行”,这是你没有做的。


解决这个问题的明显方法是使用一些中间变量。这不是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())

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


无论如何,以这些方式做事意味着你可以对每一行的结尾发表评论,所以你的问题一开始就不会出现。