PyDev代码检查问题?

时间:2017-03-20 22:25:51

标签: python pydev

我最近开始在我的项目中使用PyDev,并注意到当我尝试分配或读取不存在的属性的值时,代码检查不会抱怨。例如,在下面的屏幕截图中,第10行和第13行应该给我警告以下属性不存在。这是Python动态性质的副作用吗?

enter image description here

3 个答案:

答案 0 :(得分:2)

它并没有真正检查它们是否存在,因为我猜它需要花费太多精力。 Python代码只要有效就有效。如果你引用一个不存在的变量,那么你就会遇到问题,但Python如何知道它是否存在?它需要首先运行程序:)

答案 1 :(得分:1)

分配给不存在的属性是 定义属性的方式。这是您在典型的__init__中所做的。

如果您在班级定义中定义了一个属性,那么它就是不同的。您定义的属性,而不是实例的属性。它就像Java这样的语言中的静态属性。当您尝试访问其值时,它确实通过self解析,就像静态属性将通过this在Java中解析一样。当您尝试分配它时,您可以定义实例的属性。

class T(object):
    a = 100
    def __init__(self, a):
        self.a = a  # This shadows class's .a

w1 = T(1)
assert w1.a == 1  # Not 100

w2 = T(2)
assert w2.a == 2  # Not 100

assert T.a == 100

您可以稍后为实例和课程自由分配更多属性。

w1.foo = 100
assert w1.foo == 100

# w2 does not have .foo

def moo(self):
    return self.a * 100

T.moo = moo  # Add a method

assert w2.moo() == 200

所有这些使Python代码的静态分析成为一项非常复杂的任务。关于它的一些事情无法以比实际运行代码更简单的方式解决。

答案 2 :(得分:0)

在PyDev上创建代码分析时,这是我的一个慎重选择......

主要原因是Python的动态特性,分析检查给出了很多误报(有很多方法可以在Python上设置属性)。

PyDev仍然检查通常更静态的东西,例如导入 - 甚至通常更有条理的导入,它可能是误报的主要来源,因为代码是静态分析的 - 尽管有一种解决方法,包括配置解释器以说明正在运行的解释器通过强制内置动态分析模块...请参阅:http://www.pydev.org/manual_101_interpreter.html

第二个原因是这种检查也是处理密集型的(在设计代码分析时,我的主要目标是性能并减少误报)。

但是,如果启用PyLint集成(http://www.pydev.org/manual_adv_pylint.html),我相信您可以完成这些检查。 PyLint有不同的目标 - 它有点慢但分析了更多的东西,我相信它会抱怨你概述的问题(虽然我没有在这里测试过)。