__len__
, кажется, вызывается преждевременно и не обнаруживается моим отладчиком (против студии).Посмотрите на упрощенный код ниже, который воспроизводит проблему.
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)
После того, как я создаю экземпляр TextReader для фрейма данных (pd.read_csv) в строке 11 значение переменной self._peekBuffer
становится первыми 25 записями csv, которые я читаю, отформатирован как фрейм данных.
Как это может произойти?
self._peekBuffer
должен содержать данные только после вызова len для экземпляра DataFrameReader (например, len(_dfr)
).
Кажется действительно безумным, что pd.read_csv
может знать о методе __len__
содержащего его объекта и иметь возможность вызывать его.Кроме того, точки останова не получают, когда я оставляю их в методе __len__
, но если я закомментирую __len__
, тогда self._peekBuffer
останется как None
(как должно быть!).
Есть идеи?