скрытый вызов __len__ в pd.read_csv? - PullRequest
0 голосов
/ 27 ноября 2018

__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 (как должно быть!).

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...