__len__
似乎被过早调用,而没有被调试器(与Studio)检测到。请看下面的简化代码,它再现了问题。
class DataFrameReader:
#
def __init__(self, filePath, header=None, bufferLines=1000):
"""docstring"""
self._dataFrameReader = None
self.BufferLines = bufferLines
self._peekBuffer = None
self._dataFrameReader = pd.read_csv(filePath,
dtype=header, chunksize=bufferLines)
return
#
def __len__(self):
"""docstring"""
lineCount = None
if not self._peekBuffer:
self._peekBuffer = next(self._dataFrameReader, [])
lineCount = len(self._peekBuffer)
return lineCount
当我创建此类的实例时:
filePath = ((r'C:\Users\jmarshall\source\repos\')
(r'First200_Base_TestDataFrameIO.csv'))
_dfr = DataFrameReader(filePath, bufferLines=25)
在第11行中实例化数据帧TextReader(pd.read_csv)之后,变量self._peekBuffer
的值成为我正在读取的csv的前25条记录,格式为数据帧。
这怎么可能发生?
self._peekBuffer
仅应在DataFrameReader实例(例如len(_dfr)
)上调用len后才包含数据。
pd.read_csv
可以知道其包含对象的__len__
方法并能够调用它,真是太疯狂了。此外,当我将它们留在__len__
方法中时,不会遇到断点,但是如果我注释掉__len__
,则self._peekBuffer
会保持为None
(应该是!) )。
有什么想法吗?