声明的列表引发 NoneType 异常

Posted

技术标签:

【中文标题】声明的列表引发 NoneType 异常【英文标题】:Declared list raises NoneType exception 【发布时间】:2014-12-23 10:16:18 【问题描述】:

我有一个来自其他人的 python 模块的 sn-p,它引发了异常 (AttributeError: 'NoneType' object has no attribute 'append')。 sn-p 是:

def generateFragments(self):
    tr = self.deviceTransform()
    if tr is None:
        return
    pts = np.empty((2,len(self.data['x'])))
    pts[0] = self.data['x']
    pts[1] = self.data['y']
    pts = fn.transformCoordinates(tr, pts)
    self.fragments = []
    pts = np.clip(pts, -2**30, 2**30) ## prevent Qt segmentation fault.
                                      ## Still won't be able to render correctly, though.
    for i in xrange(len(self.data)):
        rec = self.data[i]
        pos = QtCore.QPointF(pts[0,i], pts[1,i])
        x,y,w,h = rec['fragCoords']
        rect = QtCore.QRectF(y, x, h, w)
        self.fragments.append(QtGui.QPainter.PixmapFragment.create(pos, rect))

异常信息是:

[14:35:59]  Ignored exception:

    |==============================>>
    |  Traceback (most recent call last):
    |    File "/usr/lib/pymodules/python2.7/pyqtgraph/debug.py", line 35, in w
    |      func(*args, **kwds)
    |    File "/usr/lib/pymodules/python2.7/pyqtgraph/graphicsItems/ScatterPlotItem.py", line 714, in paint
    |      self.generateFragments()
    |    File "/usr/lib/pymodules/python2.7/pyqtgraph/graphicsItems/ScatterPlotItem.py", line 685, in generateFragments
    |      self.fragments.append(QtGui.QPainter.PixmapFragment.create(pos, rect))
    |  AttributeError: 'NoneType' object has no attribute 'append'
    |  
    |==============================<<

这不是一个“修复我的错误”问题,而是一个“这怎么可能”的问题。上面几行,self.fragments 被声明为一个空列表。从那时起,对self.fragments 的唯一修改就是调用append()。类型怎么可能改变?追加操作中是否有可能将列表类型更改为NoneType 的失败?

【问题讨论】:

self.data 是属性吗?如果是这样,则该函数中可能存在将self.fragments 设置为None 的内容。我没有看到任何其他可能导致问题的原因。 是的,self.data 是一个 numpy 数组 第一次迭代是否发生异常? 不,它总是发生在 self.data 的迭代中的某个地方,并且总是在它发生时退出(即它可能发生在 25/60 并在 25 停止,下一次失败可能在迭代 0/111等) 有什么东西可以和这个函数同时运行吗?受影响的列表是实例属性而不是局部变量,因此其他代码可以轻松地将其设置为None。尝试修补代码以将列表构建为局部变量,并且仅在循环完成后将其分配给self.fragments 【参考方案1】:

我想到的两种可能性是:

并发(根据@ekhumoro 的评论)。 该类定义了一个__getattribute__ 方法,该方法使通常的属性检索机制短路。

【讨论】:

以上是关于声明的列表引发 NoneType 异常的主要内容,如果未能解决你的问题,请参考以下文章

python"TypeError: 'NoneType' object is not iterable"错误解析

声明重要的 oglplus 对象会引发异常 oglplus::MissingFunction

pip 异常:AttributeError:“NoneType”对象没有属性“startswith”

从列表中删除 NoneType 元素的本机 Python 函数?

FFImageLoading 在 Android 中引发异常并出现错误:System.TypeLoadException:由于找不到方法,无法加载方法覆盖列表:

不能正确引发异常的 PLSQL 函数