board.py
def __next_open_row(self, column: int) -> Optional[int]:
        """
        Finds the next available row to place a piece in a column

        Args:
            column: the column to check for availability

        Returns:
            The last available row or None if the column is full
        """
        # return None if column is full
        if self.__column_is_full(column):
            return None
        # find first empty cell from bottom
        row = self.__rows - 1
        while row >= 0 and self.__grid[row][column] is not None:
            row -= 1
        return row

        Finds the next available row to place a piece in a column

        Args:
            column: the column to check for availability

        Returns:
            The last available row or None if the column is full
        
Finds the next available row to place a piece in a column
Finds the next available row to place a piece in a column
def __next_open_row(self, column: int) -> Optional[int]:
        if self.__column_is_full(column):
            return None
        row = self.__rows - 1
        while row >= 0 and self.__grid[row][column] is not None:
            row -= 1
        return row
def __next_open_row ( self , column : int ) -> Optional [ int ] : if self . __column_is_full ( column ) : return None row = self . __rows - 1 while row >= 0 and self . __grid [ row ] [ column ] is not None : row -= 1 return row
Finds the next available row to place a piece in a column
Finds the next available row to place a piece in a column
"""
        Finds the next available row to place a piece in a column

        Args:
            column: the column to check for availability

        Returns:
            The last available row or None if the column is full
        """ # return None if column is full
 # find first empty cell from bottom

The last available row or None if the column is full
The last available row or None if the column is full
self
column
int
the column to check for availability
the column to check for availability