代码之家  ›  专栏  ›  技术社区  ›  Jamie Marshall

藏起来,打电话给警察局。读了吗?

  •  1
  • Jamie Marshall  · 技术社区  · 7 年前

    __len__ 似乎被过早调用,并且没有被我的调试器(vs 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行实例化dataframe TextReader(pd.read_csv)之后,变量的值 self._peekBuffer 成为我正在读取的csv的前25条记录,格式为数据帧。

    怎么会这样?

    这个 赛尔夫_偷窥缓冲区 在DataFrameReader(例如。 len(_dfr) ).

    看起来真的很疯狂 pd.read_csv 可能知道 __莱恩__ 方法,并能够调用它。此外,当我把断点放在中间位置时,没有断点被击中 __莱恩__ 方法,但如果我把它注释掉 __莱恩__ 然后 赛尔夫_偷窥缓冲区 作为 None (应该是这样的!)。

    有什么想法吗?

    0 回复  |  直到 7 年前