title: Why is it returning TypeError: object of type 'NoneType' has no len()
body: <p>Python 3.8.2 Mac Big Sur 11.2.1</p>
  <p>This code is supposed to be a simple minesweeper game in the terminal but when i run it i only get a error message (shown below) i couldn't find any help to this problem when searching around so i thought to ask it myself instead</p>
  <pre><code>import random
  import re
  
  class Board:
      def __init__(self, dim_size, num_bombs):
          self.dim_size = dim_size
          self.num_bombs = num_bombs
  
          self.board = self.make_new_board() 
          self.assign_values_to_board
  
          self.dug = set() 
  
      def make_new_board(self):
          board = [[None for _ in range(self.dim_size)] for _ in range(self.dim_size)]
  
      def assign_values_to_board(self):
          for r in range(self.dim_size):
              for c in range(self.dim_size):
                  if self.board[r][c] == '*':
                      continue
                  self.board[r][c] = self.get_num_neighboring_bombs(r, c)
  
      def get_num_neighboring_bombs(self, row, col):
          num_neighboring_bombs = 0
          for r in range(max(0, row-1), min(self.dim_size-1, row+1)+1):
              for c in range(max(0, col-1), min(self.dim_size - 1, col+1)+1):
                  if r == row and c == col:
                       continue
                  if self.board[r][c] == '*':
                      num_neighboring_bombs += 1
  
          return num_neighboring_bombs
  
          bombs_planted = 0
          while bombs_planted &lt; self.num_bombs:
              loc = random.randint(0, self.dim_size**2 - 1)
              row = loc // self.dim_size
              col = loc % self.dim_size
  
              if board [row][col] == '*':
                  # bomb already plated here
                  continue
  
              board[row][col] = '*' # plant the bomb
              bombs_planted += 1
  
          return board
  
      def dig(self, row, col):
          self.dug.add((row, col))
  
          if self.board[row][col] == '*':
              return False
          elif self.board[row][col] &gt; 0:
              return True
  
          for r in range(max(0, row-1), min(self.dim_size-1, row+1)+1):
              for c in range(max(0, col-1), min(self.dim_size - 1, col+1)+1):
                  if (r, c) in self.dug:
                      continue
                  self.dig(r, c)
  
          return True
  
      def __str__(self):
          visible_board = [[None for _ in range(self.dim_size)] for _ in range(self.dim_size)]
          for row in range(self.dim_size):
              for col in range(self.dim_size):
                  if (row,col) in self.dug:
                      visible_board[row][col] = str(self.board[row][col])
                  else: 
                      visible_board[row][col] = ' '
  
              string_rep = ''
  
              widths = []
              for idx in range(self.dim_size):
                  columns = map(lambda x: x[idx], visible_board)
                  widths.append(
                      len(
                          max(columns, key = len)
                      )
                  )
  
              indices = [i for i in range(self.dim_size)]
              indices_row = '   '
              cells = []
              for idx, col in enumerate(indices):
                  format = '%-' + str(widths[idx]) + &quot;s&quot;
                  cells.append(format % (col))
              indices_row += '  '.join(cells)
              indices_row += '  \n'
  
              for i in range(len(visible_board)):
                  row = visible_board[i]
                  string_rep += f'{i} |'
                  cells = []
                  for idx, col in enumerate(row):
                      format = '%-' + str(widths[idx]) + &quot;s&quot;
                      cells.append(format % (col))
                  string_rep += ' |'.join(cells)
                  string_rep += ' |\n'
  
              str_len = int(len(string_rep) / self.dim_size)
              string_rep = indices_row + '-'*str_len + '\n' + string_rep + '-'*str_len
  
              return string_rep
  
  def play(dim_size=10, num_bombs=10):
      board = Board(dim_size, num_bombs)
      safe = True
  
      while len(board.dug) &lt; board.dim_size ** 2 - num_bombs:
          print(board)
          user_input = re.split(',(\\s)*', input(&quot;Where would you like to dig? Input as row,col: &quot;))
          row, col = int(user_input[0]), int(user_input[-1])
          if row &lt; o or row &gt;= board.dim_size or col &lt; 0 or col &gt;= dim_size:
              print(&quot;Invalid location. Try again&quot;)
              continue
  
          safe = board.dig(row, col)
          if not safe:
              break
  
      if safe:
          print(&quot;Victory Royale!&quot;)
      else:
          print(&quot;You suck. Game Over&quot;)
          board.dug = [(r,c) for r in range(board.dim_size) for c in range(board.dim_size)]
          print(board)
  
  if __name__ == '__main__':
      play()
  </code></pre>
  <p>When i run this code it only returns</p>
  <pre><code>Traceback (most recent call last):
    File &quot;/Users/henry/Documents/projects/GamesPython/Minesweeper/game.py&quot;, line 134, in &lt;module&gt;
      play()
    File &quot;/Users/henry/Documents/projects/GamesPython/Minesweeper/game.py&quot;, line 115, in play
      print(board)
    File &quot;/Users/henry/Documents/projects/GamesPython/Minesweeper/game.py&quot;, line 82, in __str__
      max(columns, key = len)
  TypeError: object of type 'NoneType' has no len()
  </code></pre>
  <p>How can i fix this problem</p>